1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 05:47:35 +00:00

LibJS: Convert PlainMonthDay AOs to ThrowCompletionOr

This commit is contained in:
Idan Horowitz 2021-09-16 02:11:23 +03:00 committed by Linus Groh
parent 229a5ce149
commit 5ea1810ada
5 changed files with 33 additions and 49 deletions

View file

@ -170,7 +170,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::month_day_from_fields)
return {}; return {};
// 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). // 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]).
return 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

View file

@ -34,7 +34,7 @@ void PlainMonthDay::visit_edges(Visitor& visitor)
} }
// 10.5.1 ToTemporalMonthDay ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalmonthday // 10.5.1 ToTemporalMonthDay ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalmonthday
PlainMonthDay* to_temporal_month_day(GlobalObject& global_object, Value item, Object const* options) ThrowCompletionOr<PlainMonthDay*> to_temporal_month_day(GlobalObject& global_object, Value item, Object const* options)
{ {
auto& vm = global_object.vm(); auto& vm = global_object.vm();
@ -82,8 +82,8 @@ PlainMonthDay* to_temporal_month_day(GlobalObject& global_object, Value item, Ob
} else { } else {
// i. Let calendar be ? Get(item, "calendar"). // i. Let calendar be ? Get(item, "calendar").
auto calendar_value = item_object.get(vm.names.calendar); auto calendar_value = item_object.get(vm.names.calendar);
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// ii. If calendar is undefined, then // ii. If calendar is undefined, then
// 1. Let calendarAbsent be true. // 1. Let calendarAbsent be true.
@ -93,34 +93,34 @@ PlainMonthDay* to_temporal_month_day(GlobalObject& global_object, Value item, Ob
// iv. Set calendar to ? ToTemporalCalendarWithISODefault(calendar). // iv. Set calendar to ? ToTemporalCalendarWithISODefault(calendar).
calendar = to_temporal_calendar_with_iso_default(global_object, calendar_value); calendar = to_temporal_calendar_with_iso_default(global_object, calendar_value);
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->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 }); auto field_names = calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv });
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// e. Let fields be ? PrepareTemporalFields(item, fieldNames, «»). // e. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
auto* fields = prepare_temporal_fields(global_object, item_object, field_names, {}); auto* fields = prepare_temporal_fields(global_object, item_object, field_names, {});
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// f. Let month be ? Get(fields, "month"). // f. Let month be ? Get(fields, "month").
auto month = fields->get(vm.names.month); auto month = fields->get(vm.names.month);
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// g. Let monthCode be ? Get(fields, "monthCode"). // g. 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()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// h. Let year be ? Get(fields, "year"). // h. Let year be ? Get(fields, "year").
auto year = fields->get(vm.names.year); auto year = fields->get(vm.names.year);
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// i. If calendarAbsent is true, and month is not undefined, and monthCode is undefined and year is undefined, then // i. If calendarAbsent is true, and month is not undefined, and monthCode is undefined and year is undefined, then
if (calendar_absent && !month.is_undefined() && month_code.is_undefined() && year.is_undefined()) { if (calendar_absent && !month.is_undefined() && month_code.is_undefined() && year.is_undefined()) {
@ -139,7 +139,7 @@ PlainMonthDay* to_temporal_month_day(GlobalObject& global_object, Value item, Ob
} }
// 10.5.2 CreateTemporalMonthDay ( isoMonth, isoDay, calendar, referenceISOYear [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalmonthday // 10.5.2 CreateTemporalMonthDay ( isoMonth, isoDay, calendar, referenceISOYear [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalmonthday
PlainMonthDay* create_temporal_month_day(GlobalObject& global_object, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target) ThrowCompletionOr<PlainMonthDay*> create_temporal_month_day(GlobalObject& global_object, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target)
{ {
auto& vm = global_object.vm(); auto& vm = global_object.vm();
@ -147,10 +147,8 @@ PlainMonthDay* create_temporal_month_day(GlobalObject& global_object, u8 iso_mon
// 2. Assert: Type(calendar) is Object. // 2. Assert: Type(calendar) is Object.
// 3. If ! IsValidISODate(referenceISOYear, isoMonth, isoDay) is false, throw a RangeError exception. // 3. If ! IsValidISODate(referenceISOYear, isoMonth, isoDay) is false, throw a RangeError exception.
if (!is_valid_iso_date(reference_iso_year, iso_month, iso_day)) { if (!is_valid_iso_date(reference_iso_year, iso_month, iso_day))
vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidPlainMonthDay); return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidPlainMonthDay);
return {};
}
// 4. If newTarget is not present, set it to %Temporal.PlainMonthDay%. // 4. If newTarget is not present, set it to %Temporal.PlainMonthDay%.
if (!new_target) if (!new_target)
@ -161,14 +159,14 @@ PlainMonthDay* create_temporal_month_day(GlobalObject& global_object, u8 iso_mon
// 7. Set object.[[ISODay]] to isoDay. // 7. Set object.[[ISODay]] to isoDay.
// 8. Set object.[[Calendar]] to calendar. // 8. Set object.[[Calendar]] to calendar.
// 9. Set object.[[ISOYear]] to referenceISOYear. // 9. Set object.[[ISOYear]] to referenceISOYear.
auto* object = TRY_OR_DISCARD(ordinary_create_from_constructor<PlainMonthDay>(global_object, *new_target, &GlobalObject::temporal_plain_month_day_prototype, iso_month, iso_day, reference_iso_year, calendar)); auto* object = TRY(ordinary_create_from_constructor<PlainMonthDay>(global_object, *new_target, &GlobalObject::temporal_plain_month_day_prototype, iso_month, iso_day, reference_iso_year, calendar));
// 10. Return object. // 10. Return object.
return object; return object;
} }
// 10.5.3 TemporalMonthDayToString ( monthDay, showCalendar ), https://tc39.es/proposal-temporal/#sec-temporal-temporalmonthdaytostring // 10.5.3 TemporalMonthDayToString ( monthDay, showCalendar ), https://tc39.es/proposal-temporal/#sec-temporal-temporalmonthdaytostring
Optional<String> temporal_month_day_to_string(GlobalObject& global_object, PlainMonthDay& month_day, StringView show_calendar) ThrowCompletionOr<String> temporal_month_day_to_string(GlobalObject& global_object, PlainMonthDay& month_day, StringView show_calendar)
{ {
auto& vm = global_object.vm(); auto& vm = global_object.vm();
@ -182,8 +180,8 @@ Optional<String> temporal_month_day_to_string(GlobalObject& global_object, Plain
// 6. Let calendarID be ? ToString(monthDay.[[Calendar]]). // 6. Let calendarID be ? ToString(monthDay.[[Calendar]]).
auto calendar_id = Value(&month_day.calendar()).to_string(global_object); auto calendar_id = Value(&month_day.calendar()).to_string(global_object);
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
// 7. If calendarID is not "iso8601", then // 7. If calendarID is not "iso8601", then
if (calendar_id != "iso8601"sv) { if (calendar_id != "iso8601"sv) {

View file

@ -39,8 +39,8 @@ struct ISOMonthDay {
i32 reference_iso_year; i32 reference_iso_year;
}; };
PlainMonthDay* to_temporal_month_day(GlobalObject&, Value item, Object const* options = nullptr); ThrowCompletionOr<PlainMonthDay*> to_temporal_month_day(GlobalObject&, Value item, Object const* options = nullptr);
PlainMonthDay* create_temporal_month_day(GlobalObject&, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target = nullptr); ThrowCompletionOr<PlainMonthDay*> create_temporal_month_day(GlobalObject&, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target = nullptr);
Optional<String> temporal_month_day_to_string(GlobalObject&, PlainMonthDay&, StringView show_calendar); ThrowCompletionOr<String> temporal_month_day_to_string(GlobalObject&, PlainMonthDay&, StringView show_calendar);
} }

View file

@ -90,7 +90,7 @@ Value PlainMonthDayConstructor::construct(FunctionObject& new_target)
} }
// 7. Return ? CreateTemporalMonthDay(m, d, calendar, ref, NewTarget). // 7. Return ? CreateTemporalMonthDay(m, d, calendar, ref, NewTarget).
return create_temporal_month_day(global_object, m, d, *calendar, ref, &new_target); return TRY_OR_DISCARD(create_temporal_month_day(global_object, m, d, *calendar, ref, &new_target));
} }
// 10.2.2 Temporal.PlainMonthDay.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.from // 10.2.2 Temporal.PlainMonthDay.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.from
@ -113,11 +113,11 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayConstructor::from)
auto& plain_month_day_object = static_cast<PlainMonthDay&>(item.as_object()); auto& plain_month_day_object = static_cast<PlainMonthDay&>(item.as_object());
// b. Return ? CreateTemporalMonthDay(item.[[ISOMonth]], item.[[ISODay]], item.[[Calendar]], item.[[ISOYear]]). // b. Return ? CreateTemporalMonthDay(item.[[ISOMonth]], item.[[ISODay]], item.[[Calendar]], item.[[ISOYear]]).
return create_temporal_month_day(global_object, plain_month_day_object.iso_month(), plain_month_day_object.iso_day(), plain_month_day_object.calendar(), plain_month_day_object.iso_year()); return TRY_OR_DISCARD(create_temporal_month_day(global_object, plain_month_day_object.iso_month(), plain_month_day_object.iso_day(), plain_month_day_object.calendar(), plain_month_day_object.iso_year()));
} }
// 3. Return ? ToTemporalMonthDay(item, options). // 3. Return ? ToTemporalMonthDay(item, options).
return to_temporal_month_day(global_object, item, options); return TRY_OR_DISCARD(to_temporal_month_day(global_object, item, options));
} }
} }

View file

@ -96,9 +96,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::equals)
return {}; return {};
// 3. Set other to ? ToTemporalMonthDay(other). // 3. Set other to ? ToTemporalMonthDay(other).
auto* other = to_temporal_month_day(global_object, vm.argument(0)); auto* other = TRY_OR_DISCARD(to_temporal_month_day(global_object, vm.argument(0)));
if (vm.exception())
return {};
// 4. If monthDay.[[ISOMonth]] ≠ other.[[ISOMonth]], return false. // 4. If monthDay.[[ISOMonth]] ≠ other.[[ISOMonth]], return false.
if (month_day->iso_month() != other->iso_month()) if (month_day->iso_month() != other->iso_month())
@ -136,11 +134,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_string)
return {}; return {};
// 5. Return ? TemporalMonthDayToString(monthDay, showCalendar). // 5. Return ? TemporalMonthDayToString(monthDay, showCalendar).
auto string = temporal_month_day_to_string(global_object, *month_day, *show_calendar); return js_string(vm, TRY_OR_DISCARD(temporal_month_day_to_string(global_object, *month_day, *show_calendar)));
if (vm.exception())
return {};
return js_string(vm, *string);
} }
// 10.3.9 Temporal.PlainMonthDay.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tolocalestring // 10.3.9 Temporal.PlainMonthDay.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tolocalestring
@ -154,11 +148,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_locale_string)
return {}; return {};
// 3. Return ? TemporalMonthDayToString(monthDay, "auto"). // 3. Return ? TemporalMonthDayToString(monthDay, "auto").
auto string = temporal_month_day_to_string(global_object, *month_day, "auto"sv); return js_string(vm, TRY_OR_DISCARD(temporal_month_day_to_string(global_object, *month_day, "auto"sv)));
if (vm.exception())
return {};
return js_string(vm, *string);
} }
// 10.3.10 Temporal.PlainMonthDay.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tojson // 10.3.10 Temporal.PlainMonthDay.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tojson
@ -171,11 +161,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_json)
return {}; return {};
// 3. Return ? TemporalMonthDayToString(monthDay, "auto"). // 3. Return ? TemporalMonthDayToString(monthDay, "auto").
auto string = temporal_month_day_to_string(global_object, *month_day, "auto"sv); return js_string(vm, TRY_OR_DISCARD(temporal_month_day_to_string(global_object, *month_day, "auto"sv)));
if (vm.exception())
return {};
return js_string(vm, *string);
} }
// 10.3.11 Temporal.PlainMonthDay.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.valueof // 10.3.11 Temporal.PlainMonthDay.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.valueof