Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index f3709efe3fa5c4f35233249aafba05d766513b4c..7906d14fa31dbb928a9242861aa17a1f2ff4f113 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -6028,32 +6028,42 @@ class JSValue: public JSObject { |
}; |
+class DateCache; |
+ |
// Representation for JS date objects. |
class JSDate: public JSObject { |
public: |
// If one component is NaN, all of them are, indicating a NaN time value. |
// [value]: the time value. |
DECL_ACCESSORS(value, Object) |
- // [local]: the offset for the local time value. |
- DECL_ACCESSORS(local, Object) |
// [year]: caches year. Either undefined, smi, or NaN. |
DECL_ACCESSORS(year, Object) |
// [month]: caches month. Either undefined, smi, or NaN. |
DECL_ACCESSORS(month, Object) |
// [day]: caches day. Either undefined, smi, or NaN. |
DECL_ACCESSORS(day, Object) |
+ // [weekday]: caches day of week. Either undefined, smi, or NaN. |
+ DECL_ACCESSORS(weekday, Object) |
// [hour]: caches hours. Either undefined, smi, or NaN. |
DECL_ACCESSORS(hour, Object) |
// [min]: caches minutes. Either undefined, smi, or NaN. |
DECL_ACCESSORS(min, Object) |
// [sec]: caches seconds. Either undefined, smi, or NaN. |
DECL_ACCESSORS(sec, Object) |
- // [weekday]: caches day of week. Either undefined, smi, or NaN. |
- DECL_ACCESSORS(weekday, Object) |
+ // [cache stamp]: sample of the date cache stamp at the |
+ // moment when local fields were cached. |
+ DECL_ACCESSORS(cache_stamp, Object) |
// Casting. |
static inline JSDate* cast(Object* obj); |
+ // Returns the date field with the specified index. |
+ // See FieldIndex for the list of date fields. |
+ static MaybeObject* GetField(Object* date, Smi* index); |
+ |
+ void SetValue(Object* value, bool is_value_nan); |
+ |
+ |
// Dispatched behavior. |
#ifdef OBJECT_PRINT |
inline void JSDatePrint() { |
@@ -6064,23 +6074,56 @@ class JSDate: public JSObject { |
#ifdef DEBUG |
void JSDateVerify(); |
#endif |
+ // The order is important. It must be kept in sync with date macros |
+ // in macros.py. |
+ enum FieldIndex { |
+ kDateValue, |
+ kYear, |
+ kMonth, |
+ kDay, |
+ kWeekday, |
+ kHour, |
+ kMinute, |
+ kSecond, |
+ kFirstUncachedField, |
+ kMillisecond = kFirstUncachedField, |
+ kDays, |
+ kTimeInDay, |
+ kFirstUTCField, |
+ kYearUTC = kFirstUTCField, |
+ kMonthUTC, |
+ kDayUTC, |
+ kWeekdayUTC, |
+ kHourUTC, |
+ kMinuteUTC, |
+ kSecondUTC, |
+ kMillisecondUTC, |
+ kDaysUTC, |
+ kTimeInDayUTC, |
+ kTimezoneOffset |
+ }; |
// Layout description. |
static const int kValueOffset = JSObject::kHeaderSize; |
- static const int kLocalOffset = kValueOffset + kPointerSize; |
- static const int kYearOffset = kLocalOffset + kPointerSize; |
+ static const int kYearOffset = kValueOffset + kPointerSize; |
static const int kMonthOffset = kYearOffset + kPointerSize; |
static const int kDayOffset = kMonthOffset + kPointerSize; |
- static const int kHourOffset = kDayOffset + kPointerSize; |
+ static const int kWeekdayOffset = kDayOffset + kPointerSize; |
+ static const int kHourOffset = kWeekdayOffset + kPointerSize; |
static const int kMinOffset = kHourOffset + kPointerSize; |
static const int kSecOffset = kMinOffset + kPointerSize; |
- static const int kWeekdayOffset = kSecOffset + kPointerSize; |
- static const int kSize = kWeekdayOffset + kPointerSize; |
- |
- // Index of first field not requiring a write barrier. |
- static const int kFirstBarrierFree = 2; // year |
+ static const int kCacheStampOffset = kSecOffset + kPointerSize; |
+ static const int kSize = kCacheStampOffset + kPointerSize; |
private: |
+ inline Object* DoGetField(FieldIndex index); |
+ |
+ Object* GetUTCField(FieldIndex index, double value, DateCache* date_cache); |
+ |
+ // Computes and caches the cacheable fields of the date. |
+ inline void SetLocalFields(int64_t local_time_ms, DateCache* date_cache); |
+ |
+ |
DISALLOW_IMPLICIT_CONSTRUCTORS(JSDate); |
}; |