Skip to content

Commit

Permalink
Re-implement Temporal and Temporal.PlainDate basics
Browse files Browse the repository at this point in the history
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
  • Loading branch information
clover2123 committed Jan 6, 2025
1 parent 58536d0 commit 786da5e
Show file tree
Hide file tree
Showing 14 changed files with 1,089 additions and 6,693 deletions.
4 changes: 2 additions & 2 deletions src/builtins/BuiltinDate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ static Value builtinDateSetHelper(ExecutionState& state, DateSetterType setterTy
// setFullYear, setUTCFullYear case
if (!(d->isValid())) {
d->setTimeValue(DateObject::timeClip(state, 0));
d->setTimeValue(d->getTimezoneOffset(state) * const_Date_msPerMinute);
d->setTimeValue(d->getTimezoneOffset(state) * TimeConstant::MsPerMinute);
}
ASSERT(d->isValid());
}
Expand Down Expand Up @@ -421,7 +421,7 @@ static Value builtinDateSetYear(ExecutionState& state, Value thisValue, size_t a

if (!(d->isValid())) {
d->setTimeValue(DateObject::timeClip(state, 0));
d->setTimeValue(d->getTimezoneOffset(state) * const_Date_msPerMinute);
d->setTimeValue(d->getTimezoneOffset(state) * TimeConstant::MsPerMinute);
}
ASSERT(d->isValid());

Expand Down
2,485 changes: 41 additions & 2,444 deletions src/builtins/BuiltinTemporal.cpp

Large diffs are not rendered by default.

9 changes: 0 additions & 9 deletions src/intl/Intl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2261,15 +2261,6 @@ Value Intl::getOption(ExecutionState& state, Object* options, Value property, In
if (type == Intl::OptionValueType::StringValue) {
value = Value(value.toString(state));
}
// https://tc39.es/proposal-temporal/#sec-getoption
#if defined(ENABLE_TEMPORAL)
if (type == Intl::OptionValueType::NumberValue) {
value = Value(Value::DoubleToIntConvertibleTestNeeds, value.toNumber(state));
if (std::isnan(value.asNumber())) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "got invalid value");
}
}
#endif
// If values is not undefined, then
if (valuesLength) {
// If values does not contain an element equal to value, then throw a RangeError exception.
Expand Down
3 changes: 0 additions & 3 deletions src/intl/Intl.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ class Intl {
enum OptionValueType {
StringValue,
BooleanValue,
#if defined(ENABLE_TEMPORAL)
NumberValue
#endif
};
static Value getOption(ExecutionState& state, Object* options, Value property, OptionValueType type, Value* values, size_t valuesLength, const Value& fallback);
template <typename T>
Expand Down
4 changes: 4 additions & 0 deletions src/runtime/BigInt.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ class BigInt : public PointerValue {
static void throwBFException(ExecutionState& state, int status);

void* operator new(size_t size);
void* operator new(size_t, void* p)
{
return p;
}
void* operator new[](size_t size) = delete;

String* toString(int radix = 10);
Expand Down
136 changes: 62 additions & 74 deletions src/runtime/DateObject.cpp

Large diffs are not rendered by default.

46 changes: 24 additions & 22 deletions src/runtime/DateObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,29 @@ namespace Escargot {
#define TIME64NAN (1LL << 63)
#define IS_VALID_TIME(time) ((time != TIME64NAN) ? true : false)
#define IS_IN_TIME_RANGE(millisec) \
(millisec <= const_Date_MaximumDatePrimitiveValue && millisec >= -const_Date_MaximumDatePrimitiveValue)
(millisec <= TimeConstant::MaximumDatePrimitiveValue && millisec >= -TimeConstant::MaximumDatePrimitiveValue)
#define DAYS_IN_YEAR 365.2425

typedef int64_t time64_t;

static const int const_Date_daysPerWeek = 7;
static const int const_Date_daysPerYear = 365;
static const int const_Date_daysPerLeapYear = const_Date_daysPerYear + 1;
static const int const_Date_monthsPerYear = 12;
static const int64_t const_Date_MaximumDatePrimitiveValue = 8.64e15;
static const int64_t const_Date_nsPerMs = 1e6;
static const int64_t const_Date_hoursPerDay = 24;
static const int64_t const_Date_minutesPerHour = 60;
static const int64_t const_Date_secondsPerMinute = 60;
static const int64_t const_Date_secondsPerHour = const_Date_secondsPerMinute * const_Date_minutesPerHour;
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 TimeConstant {
public:
static const int DaysPerWeek = 7;
static const int DaysPerYear = 365;
static const int DaysPerLeapYear = DaysPerYear + 1;
static const int MonthsPerYear = 12;
static const int64_t MaximumDatePrimitiveValue = 8.64e15;
static const int64_t NsPerMs = 1e6;
static const int64_t HoursPerDay = 24;
static const int64_t MinutesPerHour = 60;
static const int64_t SecondsPerMinute = 60;
static const int64_t SecondsPerHour = SecondsPerMinute * MinutesPerHour;
static const int64_t MsPerSecond = 1000;
static const int64_t MsPerMinute = MsPerSecond * SecondsPerMinute;
static const int64_t MsPerHour = MsPerSecond * SecondsPerHour;
static const int64_t MsPerDay = MsPerHour * HoursPerDay;
static const int64_t MsPerMonth = 2629743000;
};

class DateObject : public DerivedObject {
public:
Expand All @@ -56,9 +58,9 @@ class DateObject : public DerivedObject {

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);
static Value makeDay(ExecutionState& state, const double year, const double month, const double day);
static Value makeTime(ExecutionState& state, const double hour, const double minute, const double sec, const double ms);
static Value makeDate(ExecutionState& state, const double day, const double time);

double primitiveValue()
{
Expand Down Expand Up @@ -92,7 +94,7 @@ class DateObject : public DerivedObject {
}
}

static int weekDay(time64_t t) { return (daysFromTime(t) + 4) % const_Date_daysPerWeek; }
static int weekDay(time64_t t) { return (daysFromTime(t) + 4) % TimeConstant::DaysPerWeek; }
static int daysInYear(int year);

void setTimeValue(time64_t t);
Expand Down Expand Up @@ -186,7 +188,7 @@ class DateObject : public DerivedObject {
static int daysFromYear(int year);
static int daysFromTime(time64_t t); // return the number of days after 1970.1.1
static time64_t daysToMs(int year, int month, int date);
static time64_t timeFromYear(int year) { return const_Date_msPerDay * daysFromYear(year); }
static time64_t timeFromYear(int year) { return TimeConstant::MsPerDay * daysFromYear(year); }
static void getYMDFromTime(time64_t t, struct timeinfo& cachedLocal);
static bool inLeapYear(int year);
};
Expand Down
1 change: 1 addition & 0 deletions src/runtime/ErrorObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ class ErrorObject : public DerivedObject {
static constexpr const char* CanNotReadPrivateMember = "Cannot read private member %s from an object whose class did not declare it";
static constexpr const char* CanNotWritePrivateMember = "Cannot write private member %s from an object whose class did not declare it";
static constexpr const char* CanNotRedefinePrivateMember = "Cannot add private field %s with same name twice";
static constexpr const char* TemporalError = "Error related with Temporal Operation";
#if defined(ENABLE_CODE_CACHE)
static constexpr const char* CodeCache_Loaded_StaticError = "[CodeCache] Default Error Message of ThrowStaticError: %s";
#endif
Expand Down
16 changes: 4 additions & 12 deletions src/runtime/GlobalObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,18 +242,10 @@ class FunctionObject;
F(finalizationRegistryPrototype, Object, objName)

#if defined(ENABLE_TEMPORAL)
#define GLOBALOBJECT_BUILTIN_TEMPORAL(F, objName) \
F(temporal, Object, objName) \
F(temporalCalendarPrototype, Object, objName) \
F(temporalDurationPrototype, Object, objName) \
F(temporalInstantPrototype, Object, objName) \
F(temporalPlainDatePrototype, Object, objName) \
F(temporalPlainDateTimePrototype, Object, objName) \
F(temporalPlainMonthDayPrototype, Object, objName) \
F(temporalPlainTimePrototype, Object, objName) \
F(temporalPlainYearMonthPrototype, Object, objName) \
F(temporalTimeZonePrototype, Object, objName) \
F(temporalZonedDateTimePrototype, Object, objName)
#define GLOBALOBJECT_BUILTIN_TEMPORAL(F, objName) \
F(temporal, Object, objName) \
F(temporalPlainDate, FunctionObject, objName) \
F(temporalPlainDatePrototype, Object, objName)
#else
#define GLOBALOBJECT_BUILTIN_TEMPORAL(F, objName)
#endif
Expand Down
156 changes: 26 additions & 130 deletions src/runtime/PointerValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,68 +345,6 @@ class PointerValue : public gc {
return false;
}

#if defined(ENABLE_TEMPORAL)
virtual bool isTemporalObject() const
{
return false;
}

virtual bool isTemporalCalendarObject() const
{
return false;
}

virtual bool isTemporalPlainDateObject() const
{
return false;
}

virtual bool isTemporalPlainTimeObject() const
{
return false;
}

virtual bool isTemporalPlainDateTimeObject() const
{
return false;
}

virtual bool isTemporalZonedDateTimeObject() const
{
return false;
}

virtual bool isTemporalInstantObject() const
{
return false;
}

virtual bool isTemporalPlainYearMonthObject() const
{
return false;
}

virtual bool isTemporalMonthDayObject() const
{
return false;
}

virtual bool isTemporalDurationObject() const
{
return false;
}

virtual bool isTemporalPlainMonthDayObject() const
{
return false;
}

virtual bool isTemporalTimeZoneObject() const
{
return false;
}
#endif

virtual bool isTypedArrayObject() const
{
return false;
Expand Down Expand Up @@ -589,6 +527,18 @@ class PointerValue : public gc {
}
#endif

#if defined(ENABLE_TEMPORAL)
virtual bool isTemporalObject() const
{
return false;
}

virtual bool isTemporalPlainDateObject() const
{
return false;
}
#endif

#if defined(ENABLE_WASM)
virtual bool isWASMModuleObject() const
{
Expand Down Expand Up @@ -681,74 +631,6 @@ class PointerValue : public gc {
return (FunctionObject*)this;
}

#if defined(ENABLE_TEMPORAL)
TemporalObject* asTemporalObject()
{
ASSERT(isTemporalObject());
return (TemporalObject*)this;
}

TemporalCalendarObject* asTemporalCalendarObject()
{
ASSERT(isTemporalCalendarObject());
return (TemporalCalendarObject*)this;
}

TemporalPlainDateObject* asTemporalPlainDateObject()
{
ASSERT(isTemporalPlainDateObject());
return (TemporalPlainDateObject*)this;
}

TemporalPlainTimeObject* asTemporalPlainTimeObject()
{
ASSERT(isTemporalPlainTimeObject());
return (TemporalPlainTimeObject*)this;
}

TemporalZonedDateTimeObject* asTemporalZonedDateTimeObject()
{
ASSERT(isTemporalZonedDateTimeObject());
return (TemporalZonedDateTimeObject*)this;
}

TemporalPlainDateTimeObject* asTemporalPlainDateTimeObject()
{
ASSERT(isTemporalPlainDateTimeObject());
return (TemporalPlainDateTimeObject*)this;
}

TemporalInstantObject* asTemporalInstantObject()
{
ASSERT(isTemporalInstantObject());
return (TemporalInstantObject*)this;
}

TemporalDurationObject* asTemporalDurationObject()
{
ASSERT(isTemporalDurationObject());
return (TemporalDurationObject*)this;
}

TemporalPlainYearMonthObject* asTemporalPlainYearMonthObject()
{
ASSERT(isTemporalPlainYearMonthObject());
return (TemporalPlainYearMonthObject*)this;
}

TemporalPlainMonthDayObject* asTemporalPlainMonthDayObject()
{
ASSERT(isTemporalPlainMonthDayObject());
return (TemporalPlainMonthDayObject*)this;
}

TemporalTimeZoneObject* asTemporalTimeZoneObject()
{
ASSERT(isTemporalTimeZoneObject());
return (TemporalTimeZoneObject*)this;
}
#endif

TypedArrayObject* asTypedArrayObject()
{
ASSERT(isTypedArrayObject());
Expand Down Expand Up @@ -1053,6 +935,20 @@ class PointerValue : public gc {
}
#endif

#if defined(ENABLE_TEMPORAL)
TemporalObject* asTemporalObject()
{
ASSERT(isTemporalObject());
return (TemporalObject*)this;
}

TemporalPlainDateObject* asTemporalPlainDateObject()
{
ASSERT(isTemporalPlainDateObject());
return (TemporalPlainDateObject*)this;
}
#endif

#if defined(ENABLE_WASM)
WASMModuleObject* asWASMModuleObject()
{
Expand Down
Loading

0 comments on commit 786da5e

Please sign in to comment.