diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
commit | 881da28418d380042aa95a97f0cbd42560a64f7c (patch) | |
tree | a794dff3274695e99c651902dde93d934ea7a5af /Source/JavaScriptCore/runtime/JSDateMath.cpp | |
parent | 7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff) | |
parent | 0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff) | |
download | qtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz |
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSDateMath.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/JSDateMath.cpp | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/Source/JavaScriptCore/runtime/JSDateMath.cpp b/Source/JavaScriptCore/runtime/JSDateMath.cpp index b69573670..1482e312f 100644 --- a/Source/JavaScriptCore/runtime/JSDateMath.cpp +++ b/Source/JavaScriptCore/runtime/JSDateMath.cpp @@ -74,7 +74,7 @@ #include "JSObject.h" #include "JSScope.h" -#include "Operations.h" +#include "JSCInlines.h" #include <algorithm> #include <limits.h> @@ -132,13 +132,14 @@ static inline int msToWeekDay(double ms) // NOTE: The implementation relies on the fact that no time zones have // more than one daylight savings offset change per month. // If this function is called with NaN it returns NaN. -static LocalTimeOffset localTimeOffset(ExecState* exec, double ms) +static LocalTimeOffset localTimeOffset(VM& vm, double ms, WTF::TimeType inputTimeType = WTF::UTCTime) { - LocalTimeOffsetCache& cache = exec->vm().localTimeOffsetCache; + LocalTimeOffsetCache& cache = vm.localTimeOffsetCache; double start = cache.start; double end = cache.end; + WTF::TimeType cachedTimeType = cache.timeType; - if (start <= ms) { + if (cachedTimeType == inputTimeType && start <= ms) { // If the time fits in the cached interval, return the cached offset. if (ms <= end) return cache.offset; @@ -146,7 +147,7 @@ static LocalTimeOffset localTimeOffset(ExecState* exec, double ms) double newEnd = end + cache.increment; if (ms <= newEnd) { - LocalTimeOffset endOffset = calculateLocalTimeOffset(newEnd); + LocalTimeOffset endOffset = calculateLocalTimeOffset(newEnd, inputTimeType); if (cache.offset == endOffset) { // If the offset at the end of the new interval still matches // the offset in the cache, we grow the cached time interval @@ -155,7 +156,7 @@ static LocalTimeOffset localTimeOffset(ExecState* exec, double ms) cache.increment = msPerMonth; return endOffset; } - LocalTimeOffset offset = calculateLocalTimeOffset(ms); + LocalTimeOffset offset = calculateLocalTimeOffset(ms, inputTimeType); if (offset == endOffset) { // The offset at the given time is equal to the offset at the // new end of the interval, so that means that we've just skipped @@ -180,32 +181,32 @@ static LocalTimeOffset localTimeOffset(ExecState* exec, double ms) // Compute the DST offset for the time and shrink the cache interval // to only contain the time. This allows fast repeated DST offset // computations for the same time. - LocalTimeOffset offset = calculateLocalTimeOffset(ms); + LocalTimeOffset offset = calculateLocalTimeOffset(ms, inputTimeType); cache.offset = offset; cache.start = ms; cache.end = ms; cache.increment = msPerMonth; + cache.timeType = inputTimeType; return offset; } -double gregorianDateTimeToMS(ExecState* exec, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC) +double gregorianDateTimeToMS(VM& vm, const GregorianDateTime& t, double milliSeconds, WTF::TimeType inputTimeType) { double day = dateToDaysFrom1970(t.year(), t.month(), t.monthDay()); double ms = timeToMS(t.hour(), t.minute(), t.second(), milliSeconds); - double result = (day * WTF::msPerDay) + ms; + double localTimeResult = (day * WTF::msPerDay) + ms; + double localToUTCTimeOffset = inputTimeType == LocalTime + ? localTimeOffset(vm, localTimeResult, inputTimeType).offset : 0; - if (!inputIsUTC) - result -= localTimeOffset(exec, result).offset; - - return result; + return localTimeResult - localToUTCTimeOffset; } // input is UTC -void msToGregorianDateTime(ExecState* exec, double ms, bool outputIsUTC, GregorianDateTime& tm) +void msToGregorianDateTime(VM& vm, double ms, WTF::TimeType outputTimeType, GregorianDateTime& tm) { LocalTimeOffset localTime; - if (!outputIsUTC) { - localTime = localTimeOffset(exec, ms); + if (outputTimeType == WTF::LocalTime) { + localTime = localTimeOffset(vm, ms); ms += localTime.offset; } @@ -222,31 +223,30 @@ void msToGregorianDateTime(ExecState* exec, double ms, bool outputIsUTC, Gregori tm.setUtcOffset(localTime.offset / WTF::msPerSecond); } -double parseDateFromNullTerminatedCharacters(ExecState* exec, const char* dateString) +double parseDateFromNullTerminatedCharacters(VM& vm, const char* dateString) { - ASSERT(exec); bool haveTZ; int offset; - double ms = WTF::parseDateFromNullTerminatedCharacters(dateString, haveTZ, offset); - if (std::isnan(ms)) - return QNaN; + double localTimeMS = WTF::parseDateFromNullTerminatedCharacters(dateString, haveTZ, offset); + if (std::isnan(localTimeMS)) + return std::numeric_limits<double>::quiet_NaN(); - // fall back to local timezone + // fall back to local timezone. if (!haveTZ) - offset = localTimeOffset(exec, ms).offset / WTF::msPerMinute; + offset = localTimeOffset(vm, localTimeMS, WTF::LocalTime).offset / WTF::msPerMinute; - return ms - (offset * WTF::msPerMinute); + return localTimeMS - (offset * WTF::msPerMinute); } -double parseDate(ExecState* exec, const String& date) +double parseDate(VM& vm, const String& date) { - if (date == exec->vm().cachedDateString) - return exec->vm().cachedDateStringValue; + if (date == vm.cachedDateString) + return vm.cachedDateStringValue; double value = parseES5DateFromNullTerminatedCharacters(date.utf8().data()); if (std::isnan(value)) - value = parseDateFromNullTerminatedCharacters(exec, date.utf8().data()); - exec->vm().cachedDateString = date; - exec->vm().cachedDateStringValue = value; + value = parseDateFromNullTerminatedCharacters(vm, date.utf8().data()); + vm.cachedDateString = date; + vm.cachedDateStringValue = value; return value; } |