Skip to content

Commit

Permalink
Update test262 version
Browse files Browse the repository at this point in the history
* fix an error in TemporalObject

Signed-off-by: HyukWoo Park <[email protected]>
  • Loading branch information
clover2123 authored and ksh8281 committed Dec 20, 2023
1 parent 282cd3f commit c12763a
Show file tree
Hide file tree
Showing 4 changed files with 2,739 additions and 312 deletions.
38 changes: 22 additions & 16 deletions src/builtins/BuiltinTemporal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,10 +271,7 @@ static Value builtinTemporalPlainTimeConstructor(ExecutionState& state, Value th
memset(values, 0, sizeof(values));

for (unsigned int i = 0; i < argc && i < 6; ++i) {
if (!argv[i].isInteger(state)) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid type");
}
values[i] = argv[i].asInt32();
values[i] = argv[i].toInteger(state);
}

return TemporalPlainTimeObject::createTemporalTime(state, values[0], values[1], values[2], values[3], values[4], values[5], newTarget);
Expand Down Expand Up @@ -394,7 +391,7 @@ static Value builtinTemporalPlainTimeToPlainDateTime(ExecutionState& state, Valu
temporalDate->day(), temporalTime->getHour(),
temporalTime->getMinute(), temporalTime->getSecond(),
temporalTime->getMillisecond(), temporalTime->getMicrosecond(),
temporalTime->getNanosecond(), thisValue.asObject()->asTemporalPlainDateObject()->getCalendar(), nullptr);
temporalTime->getNanosecond(), temporalTime->getCalendar(), nullptr);
}

static Value builtinTemporalPlainTimeGetISOFields(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
Expand Down Expand Up @@ -558,9 +555,15 @@ static Value builtinTemporalZonedDateTimeConstructor(ExecutionState& state, Valu
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "epoch Nanoseconds is out of range");
}

auto timeZone = TemporalTimeZoneObject::toTemporalTimeZone(state, argv[1]).asObject()->asTemporalTimeZoneObject();
auto calendar = TemporalCalendarObject::toTemporalCalendarWithISODefault(state, argc > 2 ? argv[2] : Value()).asObject()->asTemporalCalendarObject();
return TemporalZonedDateTimeObject::createTemporalZonedDateTime(state, *(argv[0].asBigInt()), timeZone, calendar, newTarget);
auto timeZoneValue = TemporalTimeZoneObject::toTemporalTimeZone(state, argv[1]);
if (!timeZoneValue.asObject()->isTemporalTimeZoneObject()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid type");
}
auto calendarValue = TemporalCalendarObject::toTemporalCalendarWithISODefault(state, argc > 2 ? argv[2] : Value());
if (!calendarValue.asObject()->isTemporalCalendarObject()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid type");
}
return TemporalZonedDateTimeObject::createTemporalZonedDateTime(state, *(argv[0].asBigInt()), timeZoneValue.asObject()->asTemporalTimeZoneObject(), calendarValue.asObject()->asTemporalCalendarObject(), newTarget);
}

static Value builtinTemporalZonedDateTimeFrom(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
Expand Down Expand Up @@ -1483,7 +1486,7 @@ static Value builtinTemporalCalendarPrototypeDaysInMonth(ExecutionState& state,
{
getTemporalPlainDate(state, thisValue, argc, argv);

TemporalPlainDateObject* temporalDate;
TemporalPlainDateObject* temporalDate = nullptr;

if (!argv[0].isObject() || !(argv[0].asObject()->isTemporalPlainDateObject() || argv[0].asObject()->isTemporalPlainDateTimeObject() || argv[0].asObject()->isTemporalPlainYearMonthObject())) {
temporalDate = TemporalPlainDateObject::toTemporalDate(state, argv[0]).asObject()->asTemporalPlainDateObject();
Expand All @@ -1498,9 +1501,9 @@ static Value builtinTemporalCalendarPrototypeDaysInYear(ExecutionState& state, V
{
CHECK_TEMPORAL_CALENDAR(state, thisValue, argc);

TemporalPlainDateObject* temporalDate;
TemporalPlainDateObject* temporalDate = nullptr;

if (!argv[0].isObject() || !(argv[0].asObject()->isTemporalPlainDateObject() || argv[0].asObject()->isTemporalPlainDateTimeObject() || argv[0].asObject()->isTemporalPlainYearMonthObject())) {
if (!argv[0].isObject() || !argv[0].asObject()->isTemporalPlainDateObject() || !argv[0].asObject()->isTemporalPlainDateTimeObject() || !argv[0].asObject()->isTemporalPlainYearMonthObject()) {
temporalDate = TemporalPlainDateObject::toTemporalDate(state, argv[0]).asObject()->asTemporalPlainDateObject();
} else {
temporalDate = argv[0].asObject()->asTemporalPlainDateObject();
Expand All @@ -1513,7 +1516,7 @@ static Value builtinTemporalCalendarPrototypeMonthsInYear(ExecutionState& state,
{
CHECK_TEMPORAL_CALENDAR(state, thisValue, argc);

if (!argv[0].isObject() || !(argv[0].asObject()->isTemporalPlainDateObject() || argv[0].asObject()->isTemporalPlainDateTimeObject() || argv[0].asObject()->isTemporalPlainYearMonthObject())) {
if (!argv[0].isObject() || !argv[0].asObject()->isTemporalPlainDateObject() || !argv[0].asObject()->isTemporalPlainDateTimeObject() || !argv[0].asObject()->isTemporalPlainYearMonthObject()) {
TemporalPlainDateObject::toTemporalDate(state, argv[0]);
}

Expand All @@ -1522,13 +1525,16 @@ static Value builtinTemporalCalendarPrototypeMonthsInYear(ExecutionState& state,

static Value builtinTemporalCalendarInLeapYear(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
Value temporalDateLike = argv[0];
CHECK_TEMPORAL_CALENDAR(state, thisValue, argc);
TemporalPlainDateObject* temporalDate = nullptr;

if (!temporalDateLike.isObject() || !(temporalDateLike.asObject()->isTemporalPlainDateObject() || temporalDateLike.asObject()->isTemporalPlainDateTimeObject() || temporalDateLike.asObject()->isTemporalPlainYearMonthObject())) {
temporalDateLike = TemporalPlainDateObject::toTemporalDate(state, temporalDateLike);
if (!argv[0].isObject() || !argv[0].asObject()->isTemporalPlainDateObject() || !argv[0].asObject()->isTemporalPlainDateTimeObject() || !argv[0].asObject()->isTemporalPlainYearMonthObject()) {
temporalDate = TemporalPlainDateObject::toTemporalDate(state, argv[0]).asObject()->asTemporalPlainDateObject();
} else {
temporalDate = argv[0].asObject()->asTemporalPlainDateObject();
}

return Value(TemporalCalendarObject::isIsoLeapYear(state, temporalDateLike.asObject()->asTemporalPlainDateObject()->year()));
return Value(TemporalCalendarObject::isIsoLeapYear(state, temporalDate->year()));
}

static Value builtinTemporalCalendarFields(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
Expand Down
29 changes: 18 additions & 11 deletions src/runtime/TemporalObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1766,6 +1766,10 @@ Value TemporalPlainDateTimeObject::createTemporalDateTime(ExecutionState& state,
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ISODateTime is out of limits");
}

if (!calendar.asObject()->isTemporalCalendarObject()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "");
}

TemporalDate date(isoYear, isoMonth, isoDay);
TemporalTime time(hour, minute, second, millisecond, microsecond, nanosecond);

Expand Down Expand Up @@ -3029,21 +3033,24 @@ std::map<TemporalObject::DateTimeUnits, int> TemporalDurationObject::addDuration
duration[TemporalObject::DAY_UNIT] = dateDifference->getDay();
auto result = TemporalDurationObject::balanceDuration(state, duration, largestUnit);
return TemporalDurationObject::createDurationRecord(state, dateDifference->getYear(), dateDifference->getMonth(), dateDifference->getWeek(), result[TemporalObject::DAY_UNIT], result[TemporalObject::HOUR_UNIT], result[TemporalObject::MINUTE_UNIT], result[TemporalObject::SECOND_UNIT], result[TemporalObject::MILLISECOND_UNIT], result[TemporalObject::MICROSECOND_UNIT], result[TemporalObject::NANOSECOND_UNIT]);
}
} else if (relativeTo.asObject()->isTemporalZonedDateTimeObject()) {
auto zonedDateTime = relativeTo.asObject()->asTemporalZonedDateTimeObject();
auto timeZone = zonedDateTime->getTimeZone();
auto calendar = zonedDateTime->getCalendar();
auto intermediateNs = TemporalZonedDateTimeObject::addZonedDateTime(state, zonedDateTime->getNanoseconds(), timeZone, calendar, first);
auto endNs = TemporalZonedDateTimeObject::addZonedDateTime(state, intermediateNs, timeZone, calendar, second);

auto zonedDateTime = relativeTo.asObject()->asTemporalZonedDateTimeObject();
auto timeZone = zonedDateTime->getTimeZone();
auto calendar = zonedDateTime->getCalendar();
auto intermediateNs = TemporalZonedDateTimeObject::addZonedDateTime(state, zonedDateTime->getNanoseconds(), timeZone, calendar, first);
auto endNs = TemporalZonedDateTimeObject::addZonedDateTime(state, intermediateNs, timeZone, calendar, second);
if (largestUnit <= TemporalObject::DAY_UNIT) {
auto diffNs = TemporalInstantObject::differenceInstant(state, zonedDateTime->getNanoseconds(), endNs, 1, TemporalObject::NANOSECOND_UNIT, HALF_EXPAND)->toInt64();
std::map<TemporalObject::DateTimeUnits, int> result = TemporalDurationObject::balanceDuration(state, { { TemporalObject::DAY_UNIT, 0 }, { TemporalObject::HOUR_UNIT, 0 }, { TemporalObject::MINUTE_UNIT, 0 }, { TemporalObject::SECOND_UNIT, 0 }, { TemporalObject::MILLISECOND_UNIT, 0 }, { TemporalObject::MICROSECOND_UNIT, 0 }, { TemporalObject::NANOSECOND_UNIT, diffNs } }, largestUnit);
return TemporalDurationObject::createDurationRecord(state, 0, 0, 0, 0, result[TemporalObject::HOUR_UNIT], result[TemporalObject::MINUTE_UNIT], result[TemporalObject::SECOND_UNIT], result[TemporalObject::MILLISECOND_UNIT], result[TemporalObject::MICROSECOND_UNIT], result[TemporalObject::NANOSECOND_UNIT]);
}

if (largestUnit <= TemporalObject::DAY_UNIT) {
auto diffNs = TemporalInstantObject::differenceInstant(state, zonedDateTime->getNanoseconds(), endNs, 1, TemporalObject::NANOSECOND_UNIT, HALF_EXPAND)->toInt64();
std::map<TemporalObject::DateTimeUnits, int> result = TemporalDurationObject::balanceDuration(state, { { TemporalObject::DAY_UNIT, 0 }, { TemporalObject::HOUR_UNIT, 0 }, { TemporalObject::MINUTE_UNIT, 0 }, { TemporalObject::SECOND_UNIT, 0 }, { TemporalObject::MILLISECOND_UNIT, 0 }, { TemporalObject::MICROSECOND_UNIT, 0 }, { TemporalObject::NANOSECOND_UNIT, diffNs } }, largestUnit);
return TemporalDurationObject::createDurationRecord(state, 0, 0, 0, 0, result[TemporalObject::HOUR_UNIT], result[TemporalObject::MINUTE_UNIT], result[TemporalObject::SECOND_UNIT], result[TemporalObject::MILLISECOND_UNIT], result[TemporalObject::MICROSECOND_UNIT], result[TemporalObject::NANOSECOND_UNIT]);
return TemporalZonedDateTimeObject::differenceZonedDateTime(state, const_cast<BigInt*>(zonedDateTime->getNanoseconds()), endNs, timeZone, calendar, largestUnit, new Object(state, Object::PrototypeIsNull));
}

return TemporalZonedDateTimeObject::differenceZonedDateTime(state, const_cast<BigInt*>(zonedDateTime->getNanoseconds()), endNs, timeZone, calendar, largestUnit, new Object(state, Object::PrototypeIsNull));
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "");
return std::map<TemporalObject::DateTimeUnits, int>();
}

TemporalObject::DateTimeUnits TemporalDurationObject::defaultTemporalLargestUnit(std::map<TemporalObject::DateTimeUnits, int> temporalObject)
Expand Down
2 changes: 1 addition & 1 deletion test/test262
Submodule test262 updated 7143 files
Loading

0 comments on commit c12763a

Please sign in to comment.