Add Temporal JavaScript feature

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
This commit is contained in:
Gergo Csizi 2022-05-04 12:49:43 +02:00 committed by Hyukwoo Park
commit 1763b6f38d
16 changed files with 1194 additions and 132 deletions

View file

@ -31,6 +31,7 @@ ELSEIF (${ESCARGOT_OUTPUT} STREQUAL "shell_test")
SET (ESCARGOT_CXXFLAGS ${ESCARGOT_CXXFLAGS} ${ESCARGOT_CXXFLAGS_SHELL} ${ESCARGOT_DEFINITIONS_TEST})
SET (ESCARGOT_LDFLAGS ${ESCARGOT_LDFLAGS} ${ESCARGOT_LDFLAGS_SHELL})
SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} ${ESCARGOT_DEFINITIONS_SHELL})
add_definitions(-DESCARGOT_ENABLE_TEMPORAL)
ELSEIF (${ESCARGOT_OUTPUT} STREQUAL "shared_lib")
SET (ESCARGOT_CXXFLAGS ${ESCARGOT_CXXFLAGS} ${ESCARGOT_CXXFLAGS_SHAREDLIB})
SET (ESCARGOT_LDFLAGS ${ESCARGOT_LDFLAGS} ${ESCARGOT_LDFLAGS_SHAREDLIB})

View file

@ -366,6 +366,7 @@ xcopy /Y /F .\..\..\..\..\third_party\windows\icu\source\data\out\*.dat $(Solu
<ClInclude Include="..\..\..\..\src\runtime\StringView.h" />
<ClInclude Include="..\..\..\..\src\runtime\Symbol.h" />
<ClInclude Include="..\..\..\..\src\runtime\SymbolObject.h" />
<ClInclude Include="..\..\..\..\src\runtime\TemporalObject.h" />
<ClInclude Include="..\..\..\..\src\runtime\ToStringRecursionPreventer.h" />
<ClInclude Include="..\..\..\..\src\runtime\TypedArrayObject.h" />
<ClInclude Include="..\..\..\..\src\runtime\Value.h" />

View file

@ -956,6 +956,9 @@
<ClInclude Include="..\..\..\..\src\runtime\SymbolObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\src\runtime\TemporalObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\src\runtime\ToStringRecursionPreventer.h">
<Filter>Header Files</Filter>
</ClInclude>

View file

@ -0,0 +1,297 @@
/*
* Copyright (c) 2022-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "Escargot.h"
#include "runtime/GlobalObject.h"
#include "runtime/NativeFunctionObject.h"
#include "runtime/VMInstance.h"
#include "runtime/BigIntObject.h"
#include "runtime/TemporalObject.h"
#include "runtime/DateObject.h"
#include "runtime/ArrayObject.h"
namespace Escargot {
#if defined(ESCARGOT_ENABLE_TEMPORAL)
static Value builtinTemporalNowTimeZone(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
state.context()->vmInstance()->ensureTimezone();
return Value(String::fromUTF8(state.context()->vmInstance()->timezoneID().c_str(), state.context()->vmInstance()->timezoneID().length(), true));
}
static Value builtinTemporalNowPlainDateISO(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
DateObject d(state);
d.setTimeValue(DateObject::currentTime());
return TemporalObject::toISODate(state, d);
}
static Value builtinTemporalNowPlainTimeISO(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
DateObject d(state);
d.setTimeValue(DateObject::currentTime());
return TemporalObject::toISOTime(state, d);
}
static Value builtinTemporalNowPlainDateTimeISO(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
DateObject d(state);
d.setTimeValue(DateObject::currentTime());
return TemporalObject::toISODateTime(state, d);
}
static Value builtinTemporalPlainDateConstructor(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
if (!newTarget.hasValue()) {
ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, ErrorObject::Messages::New_Target_Is_Undefined);
}
Value y = Value(argv[0].asInt32());
Value m = Value(argv[1].asInt32());
Value d = Value(argv[2].asInt32());
Value calendar = TemporalCalendar::toTemporalCalendarWithISODefault(state, argc > 4 ? argv[3] : Value());
return TemporalPlainDate::createTemporalDate(state, y, m, d, calendar, newTarget);
}
static Value builtinTemporalCalendarConstructor(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
if (!newTarget.hasValue()) {
ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, ErrorObject::Messages::New_Target_Is_Undefined);
}
String* id = argv[0].asString();
if (!TemporalCalendar::isBuiltinCalendar(id)) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, ErrorObject::Messages::GlobalObject_RangeError);
}
return TemporalCalendar::createTemporalCalendar(state, id, newTarget);
}
static Value builtinTemporalCalendarFrom(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
return TemporalCalendar::toTemporalCalendar(state, argv[0]);
}
static Value builtinTemporalCalendarPrototypeId(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
Value calendar = thisValue;
return calendar.asObject()->asTemporalCalendarObject()->getIdentifier();
}
static Value builtinTemporalCalendarPrototypeDateFromFields(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
Value calendar = thisValue;
ASSERT(calendar.asObject()->asTemporalCalendarObject()->getIdentifier()->equals("iso8601"));
if (argc > 1 && !argv[0].isObject()) {
ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, "fields is not an object");
}
Object* options;
if (argc > 1) {
options = argv[1].asObject();
} else {
options = new Object(state, Object::PrototypeIsNull);
}
// TODO ISODateFromFields https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.datefromfields
return TemporalPlainDate::createTemporalDate(state, Value(), Value(), Value(), calendar, newTarget);
}
static Value builtinTemporalCalendarInLeapYear(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
Value calendar = thisValue;
ASSERT(calendar.asObject()->asTemporalCalendarObject()->getIdentifier()->equals("iso8601"));
Value temporalDateLike = argv[0];
/*if (!temporalDateLike.isObject() || !(temporalDateLike.asObject()->asTemporalObject()->hasInitializedTemporalDate() || temporalDateLike.asObject()->asTemporalObject()->hasInitializedTemporalDateTime() || temporalDateLike.asObject()->asTemporalObject()->hasInitializedTemporalYearMonth())) {
TODO ToTemporalDate https://tc39.es/proposal-temporal/#sec-temporal-totemporaldate
}*/
return Value(TemporalCalendar::isIsoLeapYear(state, Value(temporalDateLike.asObject()->asTemporalPlainDateObject()->year())));
}
static Value builtinTemporalCalendarFields(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
Value calendar = thisValue;
ASSERT(calendar.asObject()->asTemporalCalendarObject()->getIdentifier()->equals("iso8601"));
IteratorRecord* iteratorRecord = IteratorObject::getIterator(state, argv[0]);
ValueVector fieldNames;
Optional<Object*> next;
while (true) {
next = IteratorObject::iteratorStep(state, iteratorRecord);
if (!next.hasValue()) {
break;
}
Value nextValue = IteratorObject::iteratorValue(state, next->asObject());
if (!nextValue.isString()) {
Value throwCompletion = ErrorObject::createError(state, ErrorObject::TypeError, new ASCIIString("Value is not a string"));
return IteratorObject::iteratorClose(state, iteratorRecord, throwCompletion, true);
}
for (unsigned int i = 0; i < fieldNames.size(); ++i) {
if (fieldNames[i].equalsTo(state, nextValue)) {
Value throwCompletion = ErrorObject::createError(state, ErrorObject::RangeError, new ASCIIString("Duplicated keys"));
return IteratorObject::iteratorClose(state, iteratorRecord, throwCompletion, true);
}
}
if (!(nextValue.asString()->equals("year")
|| nextValue.asString()->equals("month")
|| nextValue.asString()->equals("monthCode")
|| nextValue.asString()->equals("day")
|| nextValue.asString()->equals("hour")
|| nextValue.asString()->equals("second")
|| nextValue.asString()->equals("millisecond")
|| nextValue.asString()->equals("microsecond")
|| nextValue.asString()->equals("nanosecond"))) {
Value throwCompletion = ErrorObject::createError(state, ErrorObject::RangeError, new ASCIIString("Invalid key"));
return IteratorObject::iteratorClose(state, iteratorRecord, throwCompletion, true);
}
fieldNames.pushBack(nextValue);
}
return Object::createArrayFromList(state, fieldNames);
}
static Value builtinTemporalCalendarPrototypeMergeFields(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
ASSERT(thisValue.asObject()->asTemporalCalendarObject()->getIdentifier()->equals("iso8601"));
if (argc < 2) {
ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, "Too few arguments");
}
Value fields = argv[0];
Value additionalFields = argv[1];
return TemporalCalendar::defaultMergeFields(state, fields, additionalFields);
}
static Value builtinTemporalCalendarToString(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
return Value(thisValue.asObject()->asTemporalCalendarObject()->getIdentifier());
}
static Value builtinTemporalCalendarToJSON(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
return Value(thisValue.asObject()->asTemporalCalendarObject()->getIdentifier());
}
void GlobalObject::initializeTemporal(ExecutionState& state)
{
ObjectPropertyNativeGetterSetterData* nativeData = new ObjectPropertyNativeGetterSetterData(
true, false, true,
[](ExecutionState& state, Object* self, const Value& receiver, const EncodedValue& privateDataFromObjectPrivateArea) -> Value {
ASSERT(self->isGlobalObject());
return self->asGlobalObject()->temporal();
},
nullptr);
defineNativeDataAccessorProperty(state, ObjectPropertyName(state.context()->staticStrings().lazyTemporal()), nativeData, Value(Value::EmptyValue));
}
void GlobalObject::installTemporal(ExecutionState& state)
{
StaticStrings* strings = &state.context()->staticStrings();
m_temporal = new Object(state);
m_temporal->setGlobalIntrinsicObject(state);
m_temporalNow = new Object(state);
m_temporalNow->setGlobalIntrinsicObject(state);
m_temporalPlainDate = new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyDate(), builtinTemporalPlainDateConstructor, 4), NativeFunctionObject::__ForBuiltinConstructor__);
m_temporalPlainDate->setGlobalIntrinsicObject(state);
m_temporalPlainDatePrototype = new TemporalCalendar(state, m_objectPrototype);
m_temporalPlainDatePrototype->setGlobalIntrinsicObject(state, true);
m_temporalPlainDatePrototype->defineOwnProperty(state, ObjectPropertyName(strings->constructor), ObjectPropertyDescriptor(m_temporalPlainDate, (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalPlainDate->setFunctionPrototype(state, m_temporalPlainDatePrototype);
m_temporalCalendar = new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyCalendar(), builtinTemporalCalendarConstructor, 1), NativeFunctionObject::__ForBuiltinConstructor__);
m_temporalCalendar->setGlobalIntrinsicObject(state);
m_temporalCalendarPrototype = new TemporalCalendar(state, m_objectPrototype);
m_temporalCalendarPrototype->setGlobalIntrinsicObject(state, true);
m_temporalCalendarPrototype->defineOwnProperty(state, ObjectPropertyName(strings->constructor), ObjectPropertyDescriptor(m_temporalCalendar, (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendar->setFunctionPrototype(state, m_temporalCalendarPrototype);
m_temporal->defineOwnPropertyThrowsException(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().toStringTag),
ObjectPropertyDescriptor(Value(strings->lazyTemporal().string()), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalNow->defineOwnProperty(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().toStringTag),
ObjectPropertyDescriptor(strings->temporalDotNow.string(), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalNow->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazytimeZone()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazytimeZone(), builtinTemporalNowTimeZone, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalNow->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazyplainDateISO()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyplainDateISO(), builtinTemporalNowPlainDateISO, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalNow->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazyplainTimeISO()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyplainTimeISO(), builtinTemporalNowPlainTimeISO, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalNow->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazyplainDateTimeISO()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyplainDateTimeISO(), builtinTemporalNowPlainDateTimeISO, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalPlainDate->defineOwnProperty(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().toStringTag),
ObjectPropertyDescriptor(strings->temporalDotPlainDate.string(), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalCalendar->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->from),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->from, builtinTemporalCalendarFrom, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazyid()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyid(), builtinTemporalCalendarPrototypeId, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazydateFromFields()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazydateFromFields(), builtinTemporalCalendarPrototypeDateFromFields, 2, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazyinLeapYear()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyinLeapYear(), builtinTemporalCalendarInLeapYear, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazymergeFields()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazymergeFields(), builtinTemporalCalendarPrototypeMergeFields, 2, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->lazyfields()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyfields(), builtinTemporalCalendarFields, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->toString),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toString, builtinTemporalCalendarToString, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)ObjectPropertyDescriptor::ConfigurablePresent));
m_temporalCalendarPrototype->defineOwnPropertyThrowsException(state, ObjectPropertyName(strings->toJSON),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toJSON, builtinTemporalCalendarToJSON, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporal->defineOwnProperty(state, ObjectPropertyName(strings->lazyNow()),
ObjectPropertyDescriptor(m_temporalNow, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporal->defineOwnProperty(state, ObjectPropertyName(strings->lazyPlainDate()),
ObjectPropertyDescriptor(m_temporalPlainDate, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporal->defineOwnProperty(state, ObjectPropertyName(strings->lazyCalendar()),
ObjectPropertyDescriptor(m_temporalCalendar, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
redefineOwnProperty(state, ObjectPropertyName(strings->lazyTemporal()),
ObjectPropertyDescriptor(m_temporal, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
}
#else
void GlobalObject::initializeTemporal(ExecutionState& state)
{
// dummy initialize function
}
#endif
} // namespace Escargot

View file

@ -172,14 +172,14 @@ DateObject::DateObject(ExecutionState& state, Object* proto)
struct timespec {
long tv_sec;
long tv_nsec;
}; //header part
static int clock_gettime(int, struct timespec* spec) //C-file part
}; // header part
static int clock_gettime(int, struct timespec* spec) // C-file part
{
__int64 wintime;
GetSystemTimeAsFileTime((FILETIME*)&wintime);
wintime -= 116444736000000000i64; //1jan1601 to 1jan1970
spec->tv_sec = wintime / 10000000i64; //seconds
spec->tv_nsec = wintime % 10000000i64 * 100; //nano-seconds
wintime -= 116444736000000000i64; // 1jan1601 to 1jan1970
spec->tv_sec = wintime / 10000000i64; // seconds
spec->tv_nsec = wintime % 10000000i64 * 100; // nano-seconds
return 0;
}
#endif
@ -1419,4 +1419,49 @@ void* DateObject::operator new(size_t size)
}
return GC_MALLOC_EXPLICITLY_TYPED(size, descr);
}
Value DateObject::makeDay(ExecutionState& state, const Value& year, const Value& month, const Value& day)
{
if (!std::isfinite(year.asNumber()) && !std::isfinite(month.asNumber()) && !std::isfinite(day.asNumber())) {
return Value(std::numeric_limits<double>::quiet_NaN());
}
double y = year.asNumber();
double m = month.asNumber() - 1;
double dt = day.asNumber();
time64_t result = 0;
double ym = y + std::floor(m / const_Date_monthsPerYear);
if (!std::isfinite(ym)) {
return Value(std::numeric_limits<double>::quiet_NaN());
}
result += const_Date_msPerDay * DAYS_IN_YEAR * (ym - 1970) + const_Date_msPerMonth * ((int)m % const_Date_monthsPerYear);
return Value(std::floor(result / const_Date_msPerDay) + dt - 1);
}
Value DateObject::makeTime(ExecutionState& state, const Value& hour, const Value& minute, const Value& sec, const Value& ms)
{
if (!std::isfinite(hour.asNumber()) && !std::isfinite(minute.asNumber()) && !std::isfinite(sec.asNumber()) && !std::isfinite(ms.asNumber())) {
return Value(std::numeric_limits<double>::quiet_NaN());
}
double h = hour.asNumber();
double m = minute.asNumber();
double s = sec.asNumber();
double milli = ms.asNumber();
return Value(h * const_Date_msPerHour + m * const_Date_msPerMinute + s * const_Date_msPerSecond + milli);
}
Value DateObject::makeDate(ExecutionState& state, const Value& day, const Value& time)
{
if (!std::isfinite(day.asNumber()) && !std::isfinite(time.asNumber())) {
return Value(std::numeric_limits<double>::quiet_NaN());
}
return Value(day.toLength(state) * const_Date_msPerDay + time.toLength(state));
}
} // namespace Escargot

View file

@ -28,6 +28,7 @@ namespace Escargot {
#define IS_VALID_TIME(time) ((time != TIME64NAN) ? true : false)
#define IS_IN_TIME_RANGE(millisec) \
(millisec <= const_Date_MaximumDatePrimitiveValue && millisec >= -const_Date_MaximumDatePrimitiveValue)
#define DAYS_IN_YEAR 365.2425
typedef int64_t time64_t;
@ -45,6 +46,7 @@ static const int64_t const_Date_msPerSecond = 1000;
static const int64_t const_Date_msPerMinute = const_Date_msPerSecond * const_Date_secondsPerMinute;
static const int64_t const_Date_msPerHour = const_Date_msPerSecond * const_Date_secondsPerHour;
static const int64_t const_Date_msPerDay = const_Date_msPerHour * const_Date_hoursPerDay;
static const int64_t const_Date_msPerMonth = 2629743000;
class DateObject : public Object {
@ -54,6 +56,10 @@ public:
static time64_t currentTime();
static Value makeDay(ExecutionState& state, const Value& year, const Value& month, const Value& day);
static Value makeTime(ExecutionState& state, const Value& hour, const Value& minute, const Value& sec, const Value& ms);
static Value makeDate(ExecutionState& state, const Value& day, const Value& time);
double primitiveValue()
{
if (LIKELY(IS_VALID_TIME(m_primitiveValue)))

View file

@ -246,6 +246,13 @@ class FunctionObject;
#define GLOBALOBJECT_BUILTIN_FINALIZATIONREGISTRY(F, objName) \
F(finalizationRegistry, FunctionObject, objName) \
F(finalizationRegistryPrototype, Object, objName)
#define GLOBALOBJECT_BUILTIN_TEMPORAL(F, objName) \
F(temporal, Object, objName) \
F(temporalCalendar, FunctionObject, objName) \
F(temporalCalendarPrototype, Object, objName) \
F(temporalPlainDate, FunctionObject, objName) \
F(temporalPlainDatePrototype, Object, objName) \
F(temporalNow, Object, objName)
#if defined(ENABLE_THREADING)
#define GLOBALOBJECT_BUILTIN_ATOMICS(F, objName) \
@ -304,6 +311,7 @@ class FunctionObject;
F(STRING, String, ARG) \
F(SYMBOL, Symbol, ARG) \
F(BIGINT, BigInt, ARG) \
F(TEMPORAL, Temporal, ARG) \
F(TYPEDARRAY, TypedArray, ARG) \
F(WEAKMAP, WeakMap, ARG) \
F(WEAKSET, WeakSet, ARG) \

View file

@ -208,4 +208,27 @@ ValueVectorWithInlineStorage IteratorObject::iterableToList(ExecutionState& stat
return values;
}
/*13.1 IterableToListOfType*/
ValueVector IteratorObject::iterableToListOfType(ExecutionState& state, const Value items, const String* elementTypes)
{
IteratorRecord* iteratorRecord = IteratorObject::getIterator(state, items, true);
ValueVector values;
Optional<Object*> next;
while (true) {
next = IteratorObject::iteratorStep(state, iteratorRecord);
if (!next.hasValue()) {
break;
}
Value nextValue = IteratorObject::iteratorValue(state, next->asObject());
if (!nextValue.isString()) {
Value throwCompletion = ErrorObject::createError(state, ErrorObject::RangeError, new ASCIIString("Got invalid value"));
return { IteratorObject::iteratorClose(state, iteratorRecord, throwCompletion, true) };
}
values.pushBack(nextValue);
}
return values;
}
} // namespace Escargot

View file

@ -104,6 +104,7 @@ public:
static Object* createIterResultObject(ExecutionState& state, const Value& value, bool done);
// https://www.ecma-international.org/ecma-262/10.0/#sec-iterabletolist
static ValueVectorWithInlineStorage iterableToList(ExecutionState& state, const Value& items, Optional<Value> method = Optional<Value>());
static ValueVector iterableToListOfType(ExecutionState& state, const Value items, const String* elementTypes);
};
} // namespace Escargot

View file

@ -70,6 +70,9 @@ class GeneratorObject;
class AsyncGeneratorObject;
class AsyncFromSyncIteratorObject;
class GlobalObjectProxyObject;
class TemporalObject;
class TemporalPlainDate;
class TemporalCalendar;
class TypedArrayObject;
class ModuleNamespaceObject;
class SharedArrayBufferObject;
@ -322,6 +325,21 @@ public:
return false;
}
virtual bool isTemporalObject() const
{
return false;
}
virtual bool isTemporalCalendarObject() const
{
return false;
}
virtual bool isTemporalPlainDateObject() const
{
return false;
}
virtual bool isTypedArrayObject() const
{
return false;
@ -572,6 +590,24 @@ public:
return (FunctionObject*)this;
}
TemporalObject* asTemporalObject()
{
ASSERT(isTemporalObject());
return (TemporalObject*)this;
}
TemporalCalendar* asTemporalCalendarObject()
{
ASSERT(isTemporalCalendarObject());
return (TemporalCalendar*)this;
}
TemporalPlainDate* asTemporalPlainDateObject()
{
ASSERT(isTemporalPlainDateObject());
return (TemporalPlainDate*)this;
}
TypedArrayObject* asTypedArrayObject()
{
ASSERT(isTypedArrayObject());

View file

@ -135,6 +135,8 @@ void StaticStrings::initStaticStrings()
INIT_STATIC_STRING(symbolReplace, "[Symbol.replace]");
INIT_STATIC_STRING(symbolSearch, "[Symbol.search]");
INIT_STATIC_STRING(symbolSplit, "[Symbol.split]");
INIT_STATIC_STRING(temporalDotNow, "Temporal.Now");
INIT_STATIC_STRING(temporalDotPlainDate, "Temporal.PlainDate");
#if defined(ENABLE_WASM)
INIT_STATIC_STRING(getExports, "get exports");
@ -167,6 +169,7 @@ void StaticStrings::initStaticStrings()
#define DECLARE_LAZY_STATIC_STRING(Name, unused) m_lazy##Name = AtomicString();
FOR_EACH_LAZY_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_INTL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_TEMPORAL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_THREADING_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
#undef DECLARE_LAZY_STATIC_STRING
}
@ -181,6 +184,7 @@ void StaticStrings::initStaticStrings()
}
FOR_EACH_LAZY_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_INTL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_TEMPORAL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_THREADING_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
#undef DECLARE_LAZY_STATIC_STRING

View file

@ -797,6 +797,22 @@ namespace Escargot {
#define FOR_EACH_LAZY_INTL_STATIC_STRING(F)
#endif
#define FOR_EACH_LAZY_TEMPORAL_STATIC_STRING(F) \
F(PlainDate, "PlainDate") \
F(Temporal, "Temporal") \
F(Now, "Now") \
F(Calendar, "Calendar") \
F(dateFromFields, "dateFromFields") \
F(fields, "fields") \
F(id, "id") \
F(inLeapYear, "inLeapYear") \
F(mergeFields, "mergeFields") \
F(plainDateISO, "plainDateISO") \
F(plainDateTimeISO, "plainDateTimeISO") \
F(plainTimeISO, "plainTimeISO") \
F(timeZone, "timeZone") \
F(zonedDateTimeISO, "zonedDateTimeISO")
#if defined(ENABLE_THREADING)
#define FOR_EACH_LAZY_THREADING_STATIC_STRING(F) \
F(NotEqual, "not-equal") \
@ -933,6 +949,8 @@ public:
AtomicString symbolReplace;
AtomicString symbolSearch;
AtomicString symbolSplit;
AtomicString temporalDotNow;
AtomicString temporalDotPlainDate;
#if defined(ENABLE_WASM)
AtomicString getExports;
@ -958,6 +976,7 @@ public:
#define DECLARE_LAZY_STATIC_STRING(Name, unused) AtomicString lazy##Name();
FOR_EACH_LAZY_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_INTL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_TEMPORAL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_THREADING_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
#undef DECLARE_LAZY_STATIC_STRING
@ -974,6 +993,7 @@ protected:
#define DECLARE_LAZY_STATIC_STRING(Name, unused) AtomicString m_lazy##Name;
FOR_EACH_LAZY_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_INTL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_TEMPORAL_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
FOR_EACH_LAZY_THREADING_STATIC_STRING(DECLARE_LAZY_STATIC_STRING);
#undef DECLARE_LAZY_STATIC_STRING
};

49
src/runtime/Temporal.h Normal file
View file

@ -0,0 +1,49 @@
#if defined(ESCARGOT_ENABLE_TEMPORAL)
/*
* Copyright (c) 2022-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef __EscargotTemporal__
#define __EscargotTemporal__
#include "Escargot.h"
namespace Escargot {
class Temporal : public Object {
public:
explicit Temporal(ExecutionState& state, Object* proto)
: Object(state, proto, ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER)
{
}
bool isTemporalObject() const override
{
return true;
}
bool hasInitializedTemporalDate() const
{
return false;
}
};
} // namespace Escargot
#endif
#endif

View file

@ -0,0 +1,561 @@
#if defined(ESCARGOT_ENABLE_TEMPORAL)
/*
* Copyright (c) 2022-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "Escargot.h"
#include "TemporalObject.h"
#include "DateObject.h"
#include "runtime/VMInstance.h"
namespace Escargot {
TemporalObject::TemporalObject(ExecutionState& state)
: TemporalObject(state, state.context()->globalObject()->objectPrototype())
{
}
TemporalObject::TemporalObject(ExecutionState& state, Object* proto)
: Temporal(state, proto)
{
}
Value TemporalObject::toISODateTime(ExecutionState& state, DateObject& d)
{
auto result = std::to_string(d.getFullYear(state))
+ "-"
+ (d.getMonth(state) + 1 < 10 ? "0" : "")
+ std::to_string(d.getMonth(state) + 1)
+ "-"
+ (d.getDate(state) < 10 ? "0" : "")
+ std::to_string(d.getDate(state))
+ "T"
+ (d.getHours(state) < 10 ? "0" : "")
+ std::to_string(d.getHours(state))
+ ":"
+ (d.getMinutes(state) < 10 ? "0" : "")
+ std::to_string(d.getMinutes(state))
+ ":"
+ (d.getSeconds(state) < 10 ? "0" : "")
+ std::to_string(d.getSeconds(state)) + "+00:00";
return Value(new ASCIIString(result.data(), result.length()));
}
Value TemporalObject::toISODate(ExecutionState& state, DateObject& d)
{
auto result = std::to_string(d.getFullYear(state)) + "-" + (d.getMonth(state) + 1 < 10 ? "0" : "") + std::to_string(d.getMonth(state) + 1) + "-" + (d.getDate(state) < 10 ? "0" : "") + std::to_string(d.getDate(state));
return Value(new ASCIIString(result.data(), result.length()));
}
Value TemporalObject::toISOTime(ExecutionState& state, DateObject& d)
{
auto result = (d.getHours(state) < 10 ? "0" : "") + std::to_string(d.getHours(state)) + ":" + (d.getMinutes(state) < 10 ? "0" : "") + std::to_string(d.getMinutes(state)) + ":" + (d.getSeconds(state) < 10 ? "0" : "") + std::to_string(d.getSeconds(state)) + "." + std::to_string(d.getMilliseconds(state));
return Value(new ASCIIString(result.data(), result.length()));
}
std::map<std::string, std::string> TemporalObject::parseValidIso8601String(ExecutionState& state, const Value& str)
{
ASSERT(str.isString());
size_t pos = str.asString()->toNonGCUTF8StringData().find('[');
std::string isoDate = str.asString()->toNonGCUTF8StringData().substr(0, pos);
std::string extra;
if (pos != std::string::npos) {
extra = str.asString()->toNonGCUTF8StringData().substr(pos);
}
pos = isoDate.find('T');
if (pos != std::string::npos) {
std::replace(isoDate.begin(), isoDate.end(), 'T', ' ');
}
pos = isoDate.find(' ');
std::string date = str.asString()->toNonGCUTF8StringData().substr(0, pos);
std::string time = str.asString()->toNonGCUTF8StringData().substr(pos + 1);
std::string year;
std::string month;
std::string week;
std::string day;
pos = date.find('-');
if (pos != std::string::npos) {
if (pos == 0 && date.length() > 4) {
if (date.substr(pos + 1).find('-') == 0) {
date.erase(std::remove(date.begin(), date.end(), '-'), date.end());
if (date.length() == 4) {
month = date.substr(1, 2);
day = date.substr(3, 2);
year = "";
}
} else {
year = date;
}
} else if (date.length() > 4) {
year = date.substr(0, pos);
date = date.substr(pos + 1);
if (date.find('W') != std::string::npos && date.length() == 5) {
week = date.substr(0, 3);
day = date.substr(4);
} else if (date.length() > 2) {
month = date.substr(0, 2);
if (date[2] == '-' && date.length() == 5) {
day = date.substr(3, 2);
}
}
}
} else if (date.length() > 3) {
year = date.substr(0, 4);
if (date.find('W') != std::string::npos && date.length() > 6) {
week = date.substr(4, 3);
if (date.length() > 7) {
day = date[8];
}
} else if (date.length() > 7) {
month = date.substr(4, 2);
day = date.substr(6, 2);
}
}
std::string hour;
std::string minute;
std::string second;
std::string millisecond = "0";
std::string microSecond = "0";
std::string nanoSecond = "0";
std::string timeZone;
std::string fraction;
if (!time.empty()) {
size_t hasTimeZone = (time.find('Z') == std::string::npos ? (time.find('+') == std::string::npos ? time.find('-') : time.find('+')) : time.find('Z'));
if (time.find(',')) {
std::replace(isoDate.begin(), isoDate.end(), ',', '.');
}
if (time.find(':') != std::string::npos && time.length() > 4) {
hour = time.substr(0, 2);
minute = time.substr(2, 2);
if (time.length() > 6) {
second = time.substr(6, 2);
}
} else if (time.length() > 1) {
hour = time.substr(0, 2);
minute = time.substr(2, 2);
second = time.substr(4, 2);
}
pos = time.find('.');
if (pos != std::string::npos) {
fraction = time.substr(pos + 1, hasTimeZone);
}
if (hasTimeZone != std::string::npos) {
timeZone = time.substr(hasTimeZone);
}
}
std::string timeZoneExtension;
std::string calendar;
if (!extra.empty()) {
size_t n = std::count(extra.begin(), extra.end(), '[');
if (n == 2) {
pos = extra.find("[]");
timeZoneExtension = extra.substr(0, pos);
calendar = extra.substr(pos + 2, extra.length() - 1);
} else if (n == 1) {
timeZoneExtension = extra.substr(1, extra.length() - 1);
}
}
if (year == "-000000") {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, "Invalid year");
}
if (month.empty()) {
month = "1";
}
if (day.empty()) {
day = "1";
}
if (second == "60") {
second = "59";
}
if (!fraction.empty()) {
fraction += "000000000";
millisecond = fraction.substr(0, 3);
microSecond = fraction.substr(3, 3);
nanoSecond = fraction.substr(6, 3);
}
if (!TemporalPlainDate::isValidISODate(state, Value(year.c_str()), Value(month.c_str()), Value(day.c_str()))) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, "Invalid ISO Date");
}
if (!TemporalPlainTime::isValidTime(state, Value(hour.c_str()), Value(minute.c_str()), Value(second.c_str()), Value(millisecond.c_str()), Value(microSecond.c_str()), Value(nanoSecond.c_str()))) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, "Invalid time");
}
return std::map<std::string, std::string>{ { "Year", year }, { "Month", month }, { "Day", day }, { "Hour", hour }, { "Minute", minute }, { "Second", second }, { "Millisecond", millisecond }, { "Microsecond", microSecond }, { "Nanosecond", nanoSecond }, { "Calendar", calendar } };
}
TemporalPlainTime::TemporalPlainTime(ExecutionState& state)
: TemporalPlainTime(state, state.context()->globalObject()->objectPrototype())
{
}
TemporalPlainTime::TemporalPlainTime(ExecutionState& state, Object* proto)
: Temporal(state, proto)
{
}
Value TemporalPlainTime::createTemporalTime(ExecutionState& state, size_t argc, Value* argv, Optional<Object*> newTarget)
{
Value hour, min, sec, ms, qs, ns;
if (argc > 5) {
hour = argv[0];
min = argv[1];
sec = argv[2];
ms = argv[3];
qs = argv[4];
ns = argv[5];
} else {
ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, "Too few arguments");
}
ASSERT(hour.isInteger(state) && min.isInteger(state) && sec.isInteger(state) && ms.isInteger(state) && qs.isInteger(state) && ns.isInteger(state));
time64_t timeInMs = hour.asInt32() * 3600000 + min.asInt32() * 60000 + sec.asInt32() * 1000 + ms.asInt32();
if (!IS_IN_TIME_RANGE(timeInMs)) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, ErrorObject::Messages::GlobalObject_IllegalFirstArgument);
}
TemporalPlainTime* temporalPlainTime;
if (!newTarget.hasValue()) {
newTarget = state.resolveCallee();
}
temporalPlainTime = new TemporalPlainTime(state, newTarget->asObject());
temporalPlainTime->setTime(hour.asInt32(), min.asInt32(), sec.asInt32(), ms.asInt32(), qs.asInt32(), ns.asInt32());
temporalPlainTime->setCalendar(state, new ASCIIString("iso8601"), newTarget);
return temporalPlainTime;
}
void TemporalPlainTime::setTime(char h, char m, char s, short ms, short qs, short ns)
{
this->m_hour = h;
this->m_minute = m;
this->m_second = s;
this->m_millisecond = ms;
this->m_microsecond = qs;
this->m_nanosecond = ns;
}
void TemporalPlainTime::setCalendar(ExecutionState& state, String* id, Optional<Object*> newTarget)
{
this->calendar = TemporalCalendar::createTemporalCalendar(state, id, newTarget);
}
bool TemporalPlainTime::isValidTime(ExecutionState& state, const Value& hour, const Value& minute, const Value& second, const Value& millisecond, const Value& microsecond, const Value& nanosecond)
{
ASSERT(hour.isInteger(state) && minute.isInteger(state) && second.isInteger(state) && millisecond.isInteger(state) && microsecond.isInteger(state) && nanosecond.isInteger(state));
int h = hour.asInt32();
int m = minute.asInt32();
int s = second.asInt32();
int ms = millisecond.asInt32();
int us = microsecond.asInt32();
int ns = nanosecond.asInt32();
if (h < 0 || h > 23 || m < 0 || m > 59 || s < 0 || s > 59 || ms < 0 || ms > 999 || us < 0 || us > 999 || ns < 0 || ns > 999) {
return false;
}
return true;
}
bool TemporalCalendar::isBuiltinCalendar(String* id)
{
return id->equals("iso8601");
}
TemporalCalendar::TemporalCalendar(ExecutionState& state)
: TemporalCalendar(state, state.context()->globalObject()->objectPrototype())
{
}
TemporalCalendar::TemporalCalendar(ExecutionState& state, Object* proto)
: Temporal(state, proto)
{
}
TemporalCalendar* TemporalCalendar::createTemporalCalendar(ExecutionState& state, String* id, Optional<Object*> newTarget)
{
ASSERT(TemporalCalendar::isBuiltinCalendar(id));
if (!newTarget.hasValue()) {
newTarget = state.resolveCallee();
}
Object* proto = Object::getPrototypeFromConstructor(state, newTarget.value(), [](ExecutionState& state, Context* constructorRealm) -> Object* {
return constructorRealm->globalObject()->aggregateErrorPrototype();
});
auto* O = new TemporalCalendar(state, proto);
O->setIdentifier(id);
return O;
}
String* TemporalCalendar::getIdentifier() const
{
return m_identifier;
}
void TemporalCalendar::setIdentifier(String* id)
{
TemporalCalendar::m_identifier = id;
}
Value TemporalCalendar::getBuiltinCalendar(ExecutionState& state, String* id)
{
if (!TemporalCalendar::isBuiltinCalendar(id)) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, ErrorObject::Messages::IsNotDefined);
}
Value argv[1] = { Value(id) };
return Object::construct(state, state.context()->globalObject()->temporalCalendar(), 1, argv).toObject(state);
}
Value TemporalCalendar::getISO8601Calendar(ExecutionState& state)
{
return TemporalCalendar::getBuiltinCalendar(state, new ASCIIString("iso8601"));
}
Value TemporalCalendar::toTemporalCalendar(ExecutionState& state, const Value& calendar)
{
if (calendar.isObject()) {
auto* calendarObject = calendar.asObject()->asTemporalCalendarObject();
if (calendarObject->internalSlot()->isTemporalObject()) {
return Value(calendarObject->getIdentifier());
}
if (!calendarObject->hasProperty(state, AtomicString(state, "calendar"))) {
return calendar;
}
calendar.asObject()->get(state, AtomicString(state, "calendar"), calendar);
if (!calendarObject->hasProperty(state, AtomicString(state, "calendar"))) {
return calendar;
}
}
String* identifier = calendar.asString();
if (!TemporalCalendar::isBuiltinCalendar(identifier)) {
identifier = TemporalCalendar::parseTemporalCalendarString(state, identifier).asString();
if (!TemporalCalendar::isBuiltinCalendar(identifier)) {
ErrorObject::throwBuiltinError(state, ErrorObject::TypeError, ErrorObject::Messages::IsNotDefined);
}
}
return Value(TemporalCalendar::createTemporalCalendar(state, identifier));
}
Value TemporalCalendar::parseTemporalCalendarString(ExecutionState& state, const Value& isoString)
{
ASSERT(isoString.isString());
return TemporalObject::parseValidIso8601String(state, isoString).at("Calendar").empty() ? Value("iso8601") : Value(TemporalObject::parseValidIso8601String(state, isoString).at("Calendar").c_str());
}
Value TemporalCalendar::ISODaysInMonth(ExecutionState& state, const Value& year, const Value& month)
{
ASSERT(year.isInteger(state));
ASSERT(month.isInteger(state) && month.asInt32() > 0 && month.asInt32() < 13);
int m = month.asInt32();
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
return Value(31);
}
if (m == 4 || m == 6 || m == 9 || m == 11) {
return Value(30);
}
if (TemporalCalendar::isIsoLeapYear(state, year)) {
return Value(29);
}
return Value(28);
}
bool TemporalCalendar::isIsoLeapYear(ExecutionState& state, const Value& year)
{
ASSERT(year.isInteger(state));
int y = year.asInt32();
if (y % 4 != 0) {
return false;
}
if (y % 400 == 0) {
return true;
}
if (y % 100 == 0) {
return false;
}
return true;
}
/*12.1.6 toTemporalCalendarWithISODefault*/
Value TemporalCalendar::toTemporalCalendarWithISODefault(ExecutionState& state, const Value& calendar)
{
if (calendar.isUndefined()) {
return TemporalCalendar::getISO8601Calendar(state);
}
return TemporalCalendar::toTemporalCalendar(state, calendar);
}
Value TemporalCalendar::defaultMergeFields(ExecutionState& state, const Value& fields, const Value& additionalFields)
{
Object* merged = Object::getPrototypeFromConstructor(state, state.resolveCallee(), [](ExecutionState& state, Context* constructorRealm) -> Object* {
return constructorRealm->globalObject()->objectPrototype();
});
auto originalKeys = Object::enumerableOwnProperties(state, fields.asObject(), EnumerableOwnPropertiesType::Key);
for (auto nextKey : originalKeys) {
if (!nextKey.asString()->equals("month") || !nextKey.asString()->equals("monthCode")) {
Value propValue;
fields.asObject()->get(state, AtomicString(state, nextKey.asString()), propValue);
if (!propValue.isUndefined()) {
merged->defineOwnPropertyThrowsException(state, AtomicString(state, nextKey.asString()), ObjectPropertyDescriptor(propValue, ObjectPropertyDescriptor::AllPresent));
}
}
}
auto newKeys = Object::enumerableOwnProperties(state, additionalFields.asObject(), EnumerableOwnPropertiesType::Key);
bool containsMonth = false;
for (unsigned int i = 0; i < newKeys.size(); ++i) {
Value nextKey = originalKeys[i];
if (!nextKey.asString()->equals("month") || !nextKey.asString()->equals("monthCode")) {
containsMonth = true;
}
Value propValue;
fields.asObject()->get(state, AtomicString(state, nextKey.asString())).value(state, propValue);
if (!propValue.isUndefined()) {
merged->defineOwnPropertyThrowsException(state, AtomicString(state, nextKey.asString()), ObjectPropertyDescriptor(propValue, ObjectPropertyDescriptor::AllPresent));
}
}
if (!containsMonth) {
Value month;
fields.asObject()->get(state, AtomicString(state, "month"), month);
if (!month.isUndefined()) {
merged->defineOwnPropertyThrowsException(state, AtomicString(state, "month"), ObjectPropertyDescriptor(month, ObjectPropertyDescriptor::AllPresent));
}
Value monthCode;
fields.asObject()->get(state, AtomicString(state, "monthCode"), monthCode);
if (!monthCode.isUndefined()) {
merged->defineOwnPropertyThrowsException(state, AtomicString(state, "monthCode"), ObjectPropertyDescriptor(monthCode, ObjectPropertyDescriptor::AllPresent));
}
}
return Value(merged);
}
bool TemporalPlainDate::isValidISODate(ExecutionState& state, const Value& year, const Value& month, const Value& day)
{
ASSERT(year.isInteger(state) && month.isInteger(state) && day.isInteger(state));
if (month.asInt32() < 1 || month.asInt32() > 12) {
return false;
}
Value daysInMonth = TemporalCalendar::ISODaysInMonth(state, year, month);
if (day.asInt32() < 1 || day.asInt32() > daysInMonth.asInt32()) {
return false;
}
return true;
}
Value TemporalPlainDate::createTemporalDate(ExecutionState& state, const Value& isoYear, const Value& isoMonth, const Value& isoDay, const Value& calendar, Optional<Object*> newTarget)
{
ASSERT(isoYear.isInteger(state) && isoMonth.isInteger(state) && isoDay.isInteger(state));
ASSERT(calendar.isObject());
if (!TemporalPlainDate::isValidISODate(state, isoYear, isoMonth, isoDay)) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, "Not valid ISOdate");
}
if (!TemporalPlainDateTime::ISODateTimeWithinLimits(state, isoYear, isoMonth, isoDay, Value(12), Value(0), Value(0), Value(0), Value(0), Value(0))) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, "Not valid ISOdate");
}
Object* newTargetVariable;
if (!newTarget.hasValue()) {
newTargetVariable = state.resolveCallee();
} else {
newTargetVariable = newTarget.value();
}
Object* proto = Object::getPrototypeFromConstructor(state, newTargetVariable, [](ExecutionState& state, Context* realm) -> Object* {
return realm->globalObject()->temporalPlainDatePrototype();
});
Object* object = new TemporalPlainDate(state, proto, isoYear, isoMonth, isoDay, calendar);
return Value(object);
}
TemporalPlainDate::TemporalPlainDate(ExecutionState& state, Value isoYear, Value isoMonth, Value isoDay, Optional<Value> calendarLike)
: TemporalPlainDate(state, state.context()->globalObject()->temporalPlainDatePrototype(), isoYear, isoMonth, isoDay, calendarLike)
{
}
TemporalPlainDate::TemporalPlainDate(ExecutionState& state, Object* proto, Value isoYear, Value isoMonth, Value isoDay, Optional<Value> calendarLike)
: Temporal(state, proto)
, m_y(isoYear.asInt32())
, m_m(isoMonth.asInt32())
, m_d(isoDay.asInt32())
, m_calendar(calendarLike.value())
{
}
TemporalPlainDateTime::TemporalPlainDateTime(ExecutionState& state)
: TemporalPlainDateTime(state, state.context()->globalObject()->objectPrototype())
{
}
TemporalPlainDateTime::TemporalPlainDateTime(ExecutionState& state, Object* proto)
: Temporal(state, proto)
{
}
Value TemporalPlainDateTime::getEpochFromISOParts(ExecutionState& state, const Value& year, const Value& month, const Value& day, const Value& hour, const Value& minute, const Value& second, const Value& millisecond, const Value& microsecond, const Value& nanosecond)
{
ASSERT(year.isInteger(state) && month.isInteger(state) && day.isInteger(state) && hour.isInteger(state) && minute.isInteger(state) && second.isInteger(state) && millisecond.isInteger(state) && microsecond.isInteger(state) && nanosecond.isInteger(state));
ASSERT(TemporalPlainDate::isValidISODate(state, year, month, day));
ASSERT(TemporalPlainTime::isValidTime(state, hour, minute, second, millisecond, microsecond, nanosecond));
Value date = DateObject::makeDay(state, year, month, day);
Value time = DateObject::makeTime(state, hour, minute, second, millisecond);
Value ms = DateObject::makeDate(state, date, time);
ASSERT(std::isfinite(ms.asNumber()));
return Value(ms.toLength(state));
}
bool TemporalPlainDateTime::ISODateTimeWithinLimits(ExecutionState& state, const Value& year, const Value& month, const Value& day, const Value& hour, const Value& minute, const Value& second, const Value& millisecond, const Value& microsecond, const Value& nanosecond)
{
ASSERT(year.isInteger(state) && month.isInteger(state) && day.isInteger(state) && hour.isInteger(state) && minute.isInteger(state) && second.isInteger(state) && millisecond.isInteger(state) && microsecond.isInteger(state) && nanosecond.isInteger(state));
time64_t ms = TemporalPlainDateTime::getEpochFromISOParts(state, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond).toLength(state);
return IS_IN_TIME_RANGE(ms);
}
} // namespace Escargot
#endif

View file

@ -0,0 +1,134 @@
#if defined(ESCARGOT_ENABLE_TEMPORAL)
/*
* Copyright (c) 2022-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef __EscargotTemporalObject__
#define __EscargotTemporalObject__
#include "Escargot.h"
#include "runtime/Object.h"
#include "runtime/GlobalObject.h"
#include "runtime/Temporal.h"
namespace Escargot {
static int commonMonthOffsetLookUpTable[12] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };
static int leapMonthOffsetLookUpTable[12] = { 0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6 };
static int monthDayLookUpTable[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
class TemporalObject : public Temporal {
public:
explicit TemporalObject(ExecutionState& state);
explicit TemporalObject(ExecutionState& state, Object* proto);
static Value toISODateTime(ExecutionState& state, DateObject& d);
static Value toISODate(ExecutionState& state, DateObject& d);
static Value toISOTime(ExecutionState& state, DateObject& d);
static std::map<std::string, std::string> parseValidIso8601String(ExecutionState& state, const Value& str);
};
class TemporalCalendar : public Temporal {
public:
explicit TemporalCalendar(ExecutionState& state);
explicit TemporalCalendar(ExecutionState& state, Object* proto);
bool isTemporalCalendarObject() const override
{
return true;
}
static TemporalCalendar* createTemporalCalendar(ExecutionState& state, String* id, Optional<Object*> newTarget = Optional<Object*>());
static bool isBuiltinCalendar(String* id);
static Value getBuiltinCalendar(ExecutionState& state, String* id);
static Value getISO8601Calendar(ExecutionState& state);
static Value toTemporalCalendar(ExecutionState& state, const Value& calendar);
static Value toTemporalCalendarWithISODefault(ExecutionState& state, const Value& calendar);
static Value parseTemporalCalendarString(ExecutionState& state, const Value& isoString);
static Value ISODaysInMonth(ExecutionState& state, const Value& year, const Value& month);
static bool isIsoLeapYear(ExecutionState& state, const Value& year);
static Value defaultMergeFields(ExecutionState& state, const Value& fields, const Value& additionalFields);
String* getIdentifier() const;
void setIdentifier(String* identifier);
private:
String* m_identifier;
};
class TemporalPlainDate : public Temporal {
public:
explicit TemporalPlainDate(ExecutionState& state, Value isoYear, Value isoMonth, Value isoDay, Optional<Value> calendarLike);
explicit TemporalPlainDate(ExecutionState& state, Object* proto, Value isoYear, Value isoMonth, Value isoDay, Optional<Value> calendarLike);
static Value createTemporalDate(ExecutionState& state, const Value& isoYear, const Value& isoMonth, const Value& isoDay, const Value& calendar, Optional<Object*> newTarget);
static bool isValidISODate(ExecutionState& state, const Value& year, const Value& month, const Value& day);
bool hasInitializedTemporalDate() const
{
return true;
}
int year() const { return m_y; }
int month() const { return m_m; }
int day() const { return m_d; }
private:
int m_y;
int m_m;
int m_d;
Value m_calendar;
};
class TemporalPlainTime : public Temporal {
public:
explicit TemporalPlainTime(ExecutionState& state);
explicit TemporalPlainTime(ExecutionState& state, Object* proto);
static Value createTemporalTime(ExecutionState& state, size_t argc, Value* argv, Optional<Object*> newTarget);
static bool isValidTime(ExecutionState& state, const Value& hour, const Value& minute, const Value& second, const Value& millisecond, const Value& microsecond, const Value& nanosecond);
void setTime(char h, char m, char s, short ms, short qs, short ns);
void setCalendar(ExecutionState& state, String* calendar, Optional<Object*> newTarget);
private:
short m_year;
char m_month;
char m_day;
char m_hour;
char m_minute;
char m_second;
short m_millisecond;
short m_microsecond;
short m_nanosecond;
TemporalCalendar* calendar;
};
class TemporalPlainDateTime : public Temporal {
public:
explicit TemporalPlainDateTime(ExecutionState& state);
explicit TemporalPlainDateTime(ExecutionState& state, Object* proto);
static Value getEpochFromISOParts(ExecutionState& state, const Value& year, const Value& month, const Value& day, const Value& hour, const Value& minute, const Value& second, const Value& millisecond, const Value& microsecond, const Value& nanosecond);
static bool ISODateTimeWithinLimits(ExecutionState& state, const Value& year, const Value& month, const Value& day, const Value& hour, const Value& minute, const Value& second, const Value& millisecond, const Value& microsecond, const Value& nanosecond);
};
} // namespace Escargot
#endif
#endif

View file

@ -529,23 +529,15 @@
<test id="built-ins/ShadowRealm/prototype/importValue/throws-if-import-value-does-not-exist"><reason>TODO</reason></test>
<test id="built-ins/ShadowRealm/prototype/importValue/validates-realm-object"><reason>TODO</reason></test>
<test id="built-ins/ShadowRealm/prototype/proto"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/calendar-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/calendar-object-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/calendar-object-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/calendar-string-builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/calendar-string-not-builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/from/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/missing-arguments"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/add-days"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/add-months"><reason>TODO</reason></test>
@ -570,21 +562,15 @@
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/duration-argument-string-negative-fractional-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/overflow-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/throw-range-error-from-ToTemporalDate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/throw-range-error-from-ToTemporalDuration"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateAdd/throw-type-error-from-GetOptionsObject"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/fields-not-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-wrong-type"><reason>TODO</reason></test>
@ -614,11 +600,9 @@
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/no-options"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/throws-range-error-ToLargestTemporalUnit"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/throws-range-error-ToTemporalDate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dateUntil/throws-type-error-GetOptionsObject"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
@ -633,7 +617,6 @@
<test id="built-ins/Temporal/Calendar/prototype/day/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/month-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/day/throw-range-error-ToTemporalDate"><reason>TODO</reason></test>
@ -648,7 +631,6 @@
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/plain-date"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/plain-date-time"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfWeek/prop-desc"><reason>TODO</reason></test>
@ -665,7 +647,6 @@
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/plain-date"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/plain-date-time"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/dayOfYear/prop-desc"><reason>TODO</reason></test>
@ -682,7 +663,6 @@
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/plain-date"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/plain-date-time"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInMonth/prop-desc"><reason>TODO</reason></test>
@ -701,7 +681,6 @@
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInWeek/throw-range-error-ToTemporalDate"><reason>TODO</reason></test>
@ -716,22 +695,12 @@
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/plain-date"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/plain-date-time"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/daysInYear/throw-range-error-ToTemporalDate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/argument-iterable-not-array"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/argument-throws-duplicate-keys"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/argument-throws-invalid-keys"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/long-input"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/non-string-element-throws"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/repeated-throw"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/fields/reverse"><reason>TODO</reason></test>
@ -741,21 +710,13 @@
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-fields-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/inLeapYear/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/arguments-empty-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/arguments-not-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/mergeFields/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
@ -771,7 +732,6 @@
<test id="built-ins/Temporal/Calendar/prototype/month/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/month-day-throw-type-error"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/month/throw-range-error-ToTemporalDate"><reason>TODO</reason></test>
@ -790,18 +750,15 @@
<test id="built-ins/Temporal/Calendar/prototype/monthCode/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/month-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/throw-range-error-ToTemporalDate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthCode/year-month"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-wrong-type"><reason>TODO</reason></test>
@ -817,18 +774,8 @@
<test id="built-ins/Temporal/Calendar/prototype/monthsInYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthsInYear/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthsInYear/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthsInYear/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/monthsInYear/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toJSON/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toJSON/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toJSON/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toJSON/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toJSON/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toString/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toString/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toString/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toString/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toString/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/toString/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
@ -842,7 +789,6 @@
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/weekOfYear/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
@ -857,18 +803,15 @@
<test id="built-ins/Temporal/Calendar/prototype/year/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/throw-range-error-ToTemporalDate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/year/year-month"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-wrong-type"><reason>TODO</reason></test>
@ -898,7 +841,6 @@
<test id="built-ins/Temporal/Duration/compare/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/compare/timezone-getpossibleinstantsfor-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/compare/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/days-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/from/argument-existing-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/from/argument-non-string"><reason>TODO</reason></test>
@ -1160,7 +1102,6 @@
<test id="built-ins/Temporal/Duration/seconds-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/weeks-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Duration/years-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/argument"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/compare/argument-zoneddatetime"><reason>TODO</reason></test>
@ -1170,7 +1111,6 @@
<test id="built-ins/Temporal/Instant/compare/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/compare/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/compare/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/from/argument-zoneddatetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/from/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Instant/from/instant-string"><reason>TODO</reason></test>
@ -1401,7 +1341,6 @@
<test id="built-ins/Temporal/Now/instant/extensible"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/instant/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/instant/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/instant/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/instant/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/instant/return-value-distinct"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/instant/return-value-prototype"><reason>TODO</reason></test>
@ -1413,7 +1352,6 @@
<test id="built-ins/Temporal/Now/plainDate/timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDate/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDate/toPlainDate-override"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateISO/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateISO/timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateISO/timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateISO/timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
@ -1428,14 +1366,12 @@
<test id="built-ins/Temporal/Now/plainDateTime/extensible"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/return-value"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/time-zone-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-getoffsetnanosecondsfor-invocation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-getoffsetnanosecondsfor-non-method"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-getoffsetnanosecondsfor-not-a-number"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-getoffsetnanosecondsfor-poisoned"><reason>TODO</reason></test>
@ -1447,10 +1383,6 @@
<test id="built-ins/Temporal/Now/plainDateTime/timezone-object-fail-has-nested-timezone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-object-fail-has-timezone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTime/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/extensible"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/return-value"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/time-zone-undefined"><reason>TODO</reason></test>
@ -1468,22 +1400,15 @@
<test id="built-ins/Temporal/Now/plainDateTimeISO/timezone-object-fail-has-nested-timezone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/timezone-object-fail-has-timezone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainDateTimeISO/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/timezone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/plainTimeISO/toPlainTime-override"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/extensible"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/new-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/timeZone/return-value"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/toStringTag/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/toStringTag/string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/calendar-function"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/calendar-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-call-tostring"><reason>TODO</reason></test>
@ -1494,7 +1419,6 @@
<test id="built-ins/Temporal/Now/zonedDateTime/extensible"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/time-zone-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTime/timezone-object"><reason>TODO</reason></test>
@ -1506,7 +1430,6 @@
<test id="built-ins/Temporal/Now/zonedDateTimeISO/extensible"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTimeISO/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTimeISO/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTimeISO/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTimeISO/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTimeISO/time-zone-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/Now/zonedDateTimeISO/timezone-object"><reason>TODO</reason></test>
@ -1529,10 +1452,8 @@
<test id="built-ins/Temporal/PlainDate/compare/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/compare/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/compare/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/compare/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/compare/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/compare/use-internal-slots"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/argument-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/argument-plaindate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/argument-plaindatetime"><reason>TODO</reason></test>
@ -1546,8 +1467,6 @@
<test id="built-ins/Temporal/PlainDate/from/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/from/overflow-invalid-string"><reason>TODO</reason></test>
@ -1572,8 +1491,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/add/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/negative-infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/non-integer-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string"><reason>TODO</reason></test>
@ -1611,7 +1528,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/equals/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/equals/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/equals/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/equals/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/builtin"><reason>TODO</reason></test>
@ -1620,7 +1536,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/field-traversal-order"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/getISOFields/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/inLeapYear/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/inLeapYear/prop-desc"><reason>TODO</reason></test>
@ -1653,7 +1568,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/since/largestunit-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/since/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/since/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/since/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/since/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/since/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/since/roundingincrement-nan"><reason>TODO</reason></test>
@ -1679,8 +1593,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/subtract/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/negative-infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/non-integer-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string"><reason>TODO</reason></test>
@ -1692,13 +1604,8 @@
<test id="built-ins/Temporal/PlainDate/prototype/toJSON/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toJSON/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toJSON/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toJSON/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toJSON/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/options-conflict"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toLocaleString/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
@ -1712,9 +1619,7 @@
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/time-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainDateTime/time-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/builtin"><reason>TODO</reason></test>
@ -1722,7 +1627,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-fields-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/builtin"><reason>TODO</reason></test>
@ -1730,16 +1634,11 @@
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-fields-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/calendarname-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/calendarname-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toString/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
@ -1750,7 +1649,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-argument-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
@ -1782,7 +1680,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/until/largestunit-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/until/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/until/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/until/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/until/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/until/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/until/roundingincrement-nan"><reason>TODO</reason></test>
@ -1799,10 +1696,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/until/smallestunit-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/valueOf/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/weekOfYear/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/weekOfYear/branding"><reason>TODO</reason></test>
@ -1811,13 +1704,10 @@
<test id="built-ins/Temporal/PlainDate/prototype/with/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/calendar-fields-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/calendar-merge-fields-returns-primitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/copies-merge-fields-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string"><reason>TODO</reason></test>
@ -1833,7 +1723,6 @@
<test id="built-ins/Temporal/PlainDate/prototype/withCalendar/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/withCalendar/missing-argument"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/withCalendar/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/withCalendar/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/withCalendar/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/withCalendar/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDate/prototype/year/branding"><reason>TODO</reason></test>
@ -1857,7 +1746,6 @@
<test id="built-ins/Temporal/PlainDateTime/compare/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/compare/read-time-fields-before-datefromfields"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/compare/use-internal-slots"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/argument-plaindate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
@ -2243,12 +2131,10 @@
<test id="built-ins/Temporal/PlainMonthDay/calendar-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/calendar-fields-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-leap-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-missing-properties"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-plainmonthday"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-string"><reason>TODO</reason></test>
@ -2256,7 +2142,6 @@
<test id="built-ins/Temporal/PlainMonthDay/from/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/overflow"><reason>TODO</reason></test>
@ -2380,7 +2265,6 @@
<test id="built-ins/Temporal/PlainTime/compare/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/compare/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/compare/use-internal-slots"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-string-with-calendar"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
@ -2661,7 +2545,6 @@
<test id="built-ins/Temporal/PlainYearMonth/compare/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/compare/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/compare/use-internal-slots"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/from/argument-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/from/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/from/calendar-fields-iterable"><reason>TODO</reason></test>
@ -2877,7 +2760,6 @@
<test id="built-ins/Temporal/PlainYearMonth/refisoday-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/TimeZone/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/TimeZone/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/TimeZone/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/TimeZone/from/argument-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/TimeZone/from/argument-object-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/TimeZone/from/argument-primitive"><reason>TODO</reason></test>
@ -3026,7 +2908,6 @@
<test id="built-ins/Temporal/ZonedDateTime/compare/timezone-getpossibleinstantsfor-iterable"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/compare/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/compare/zoneddatetime-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/from/argument-propertybag-timezone-getoffsetnanosecondsfor-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/from/argument-propertybag-timezone-getoffsetnanosecondsfor-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/from/argument-propertybag-timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
@ -3055,7 +2936,6 @@
<test id="built-ins/Temporal/ZonedDateTime/from/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/from/zoneddatetime-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/missing-arguments"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-negative-fractional-units"><reason>TODO</reason></test>
@ -3571,10 +3451,6 @@
<test id="built-ins/Temporal/ZonedDateTime/prototype/year/timezone-getoffsetnanosecondsfor-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/ZonedDateTime/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/getOwnPropertyNames"><reason>TODO</reason></test>
<test id="built-ins/Temporal/keys"><reason>TODO</reason></test>
<test id="built-ins/Temporal/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/toStringTag/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/toStringTag/string"><reason>TODO</reason></test>
<test id="built-ins/ThrowTypeError/unique-per-realm-function-proto"><reason>TODO</reason></test>
<test id="built-ins/TypedArray/prototype/at/BigInt/return-abrupt-from-this-out-of-bounds"><reason>TODO</reason></test>
<test id="built-ins/TypedArray/prototype/at/return-abrupt-from-this-out-of-bounds"><reason>TODO</reason></test>
@ -3737,7 +3613,6 @@
<test id="intl402/Locale/constructor-options-region-valid"><reason>TODO</reason></test>
<test id="intl402/Locale/extensions-grandfathered"><reason>TODO</reason></test>
<test id="intl402/Locale/likely-subtags-grandfathered"><reason>TODO</reason></test>
<test id="intl402/Locale/prototype/minimize/removing-likely-subtags-first-adds-likely-subtags"><reason>TODO</reason></test>
<test id="intl402/Locale/reject-duplicate-variants-in-tlang"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/constructor-unit"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/dft-currency-mnfd-range-check-mxfd"><reason>TODO</reason></test>
@ -3843,14 +3718,12 @@
<test id="intl402/Temporal/Calendar/prototype/era/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/era/length"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/era/name"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/era/not-a-constructor"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/era/prop-desc"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/branding"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/builtin"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/length"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/name"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/not-a-constructor"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/eraYear/prop-desc"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/inLeapYear/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/Calendar/prototype/month/infinity-throws-rangeerror"><reason>TODO</reason></test>