mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
a128924c0d
- Bug 930414 - Instantiate module function defintions earlier as per the spec r=shu (c0f7f01c16) - Bug 819125 - Reset return value before executing catch/finally block. r=jandem (005fc7dc26) - Bug 1216623 - Part 2: In for (let ...) loops, evaluate initializers in the scope of the variables being initialized. r=Waldo. (a09e74569a) - Bug 1219877 - Allow let token with TOK_NAME in strict mode in Parser::shouldParseLetDeclaration. r=shu (d76dbab3d4) - Bug 932517 - Followup: remove let-block logic in sloppy mode ES6 let declaration check. (rs=evilpie) (c6e0c8661a) - Bug 1212305: Also mark lazy link frames, r=jandem (cd3601052c) - Bug 1216140 - Load the global lexical scope for the BINDGNAME Baseline IC when the script doesn't have a non-syntactic scope chain. (r=jandem) (370cccbd8a) - Bug 1144630 - Install class methods as non-enumerable on instances. (r=evilpie) (1158b1ffdb) - Bug 1218639 - IonMonkey: MIPS64: Add support into jit. r=nbp (f521201ec3) - Bug 1213740 - IonMonkey: MIPS64: Import Bailouts-mips64. r=nbp f=rankov (5e810a94d9) - Bug 1213741 - IonMonkey: MIPS64: Import BaselineCompiler-mips64. r=nbp f=rankov (c6eb2d72b1) - Bug 1213742 - IonMonkey: MIPS64: Import BaselineIC-mips64. r=nbp f=rankov (67b78d1345) - Bug 1213745 - IonMonkey: MIPS64: Import Lowering-mips64. r=nbp f=rankov (d1e60521f2) - Bug 1213749 - IonMonkey: MIPS64: Import SharedIC-mips64. r=nbp f=rankov (4a2184d535) - Bug 1213750 - IonMonkey: MIPS64: Import Trampoline-mips64. r=nbp f=rankov (382237c7db) - Bug 1213743 - IonMonkey: MIPS64: Import CodeGenerator-mips64. r=lth f=nbp,rankov (4f7d1720d6) - Bug 1213747 - IonMonkey: MIPS64: Import MoveEmitter-mips64. r=nbp f=rankov (63a53396e6) - Bug 1213751 - IonMonkey: MIPS64: Import Simulator-mips64. r=jandem (ac2f67fd43) - Bug 1218652 - IonMonkey: MIPS: Add mips-shared in check macroassembler style. r=arai (cf6f2bf5db) - Bug 1205134 - IonMonkey: MIPS: Split shareable code to mips-shared in MacroAssembler-mips32. r=lth f=nbp (3608ef227a) - Bug 1218652 - IonMonkey: MIPS: Move shared functions to mips-shared. r=arai (d716fa56bc) - Bug 1219137 - IonMonkey: MIPS: Fix PushRegsInMask and PopRegsInMaskIgnore can not shared. r=arai (13e5811e19) - Bug 1213746 - IonMonkey: MIPS64: Import MacroAssembler-mips64. r=lthf=rankov (3a7cb6fbd6) - Bug 1196545 - unboxed array snafus. r=jandem (31bbe773b2) - Bug 1224411 - Speed up FileRegistry._partial_paths by memoizing on the basis of directory. r=nalexander (d202d614a9) - Bug 1153790 - mac unification doesn't work with packaged addons. r=glandium (269cc3e37c) - Bug 1208320 - Support configuring zlib compression level; r=glandium (502de5e78a) - Bug 1163077 - Never elfhack if --disable-compile-environment is set. r=glandium (a484cb9a2f) - Bug 1213418 - Part 1: Use mozregression to download in |mach artifact|. r=me (93e1cb3aa2) - Bug 1213418 - Part 2: Use Fennec APKs in |mach artifact|; use mozversion to extract build IDs. r=me (27efbe8404) - Bug 1191051 - Use full 40 character hashes in |mach artifact|. r=gps (43992efbee) - Bug 1192064 - Add 'android-x86' job to |mach artifact|. r=jonalmeida (c0e7d6c8f8) - No bug - Don't write artifacts twice. r=me (e5eff7d6de) - Bug 1208808 - Move time zone adjustment information out of JSRuntime, into global state protected by a spinlock. r=till (20c6e76cc7) - Bug 1181612: Rename AsmJSFunctionLabels to make them easier to understand; r=luke (c6d88f944b) - Bug 1181612: Remove FunctionCompiler's RetType; r=luke (2f7483bfe2) - Bug 1214467 - Eliminate redundant loop header phis while emitting MIR for asm.js. r=luke (6c50f9b407) - Bug 1205390 - make Odin accept TypedArray constructors for shared memory. r=luke (400f892775) - Bug 1181612: Make asm.js internal calls thread-local; r=luke (aed88de095) - Bug 1219143 - IonMonkey: MIPS: Move callAndPushReturnAddress to mips-shared. r=lth (b9cd97f491) - Bug 1217326 - fork remaining atomics. r=h4writer. (65cc2a2b07)
155 lines
5.5 KiB
C++
155 lines
5.5 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||
|
||
/* JavaScript date/time computation and creation functions. */
|
||
|
||
#ifndef js_Date_h
|
||
#define js_Date_h
|
||
|
||
/*
|
||
* Dates in JavaScript are defined by IEEE-754 double precision numbers from
|
||
* the set:
|
||
*
|
||
* { t ∈ ℕ : -8.64e15 ≤ t ≤ +8.64e15 } ∪ { NaN }
|
||
*
|
||
* The single NaN value represents any invalid-date value. All other values
|
||
* represent idealized durations in milliseconds since the UTC epoch. (Leap
|
||
* seconds are ignored; leap days are not.) +0 is the only zero in this set.
|
||
* The limit represented by 8.64e15 milliseconds is 100 million days either
|
||
* side of 00:00 January 1, 1970 UTC.
|
||
*
|
||
* Dates in the above set are represented by the |ClippedTime| class. The
|
||
* double type is a superset of the above set, so it *may* (but need not)
|
||
* represent a date. Use ECMAScript's |TimeClip| method to produce a date from
|
||
* a double.
|
||
*
|
||
* Date *objects* are simply wrappers around |TimeClip|'d numbers, with a bunch
|
||
* of accessor methods to the various aspects of the represented date.
|
||
*/
|
||
|
||
#include "mozilla/FloatingPoint.h"
|
||
#include "mozilla/MathAlgorithms.h"
|
||
|
||
#include "js/Conversions.h"
|
||
#include "js/Value.h"
|
||
|
||
struct JSContext;
|
||
|
||
namespace JS {
|
||
|
||
/**
|
||
* Re-query the system to determine the current time zone adjustment from UTC,
|
||
* including any component due to DST. If the time zone has changed, this will
|
||
* cause all Date object non-UTC methods and formatting functions to produce
|
||
* appropriately adjusted results.
|
||
*
|
||
* Left to its own devices, SpiderMonkey itself may occasionally call this
|
||
* method to attempt to keep up with system time changes. However, no
|
||
* particular frequency of checking is guaranteed. Embedders unable to accept
|
||
* occasional inaccuracies should call this method in response to system time
|
||
* changes, or immediately before operations requiring instantaneous
|
||
* correctness, to guarantee correct behavior.
|
||
*/
|
||
extern JS_PUBLIC_API(void)
|
||
ResetTimeZone();
|
||
|
||
class ClippedTime;
|
||
inline ClippedTime TimeClip(double time);
|
||
|
||
/*
|
||
* |ClippedTime| represents the limited subset of dates/times described above.
|
||
*
|
||
* An invalid date/time may be created through the |ClippedTime::invalid|
|
||
* method. Otherwise, a |ClippedTime| may be created using the |TimeClip|
|
||
* method.
|
||
*
|
||
* In typical use, the user might wish to manipulate a timestamp. The user
|
||
* performs a series of operations on it, but the final value might not be a
|
||
* date as defined above -- it could have overflowed, acquired a fractional
|
||
* component, &c. So as a *final* step, the user passes that value through
|
||
* |TimeClip| to produce a number restricted to JavaScript's date range.
|
||
*
|
||
* APIs that accept a JavaScript date value thus accept a |ClippedTime|, not a
|
||
* double. This ensures that date/time APIs will only ever receive acceptable
|
||
* JavaScript dates. This also forces users to perform any desired clipping,
|
||
* as only the user knows what behavior is desired when clipping occurs.
|
||
*/
|
||
class ClippedTime
|
||
{
|
||
double t;
|
||
|
||
explicit ClippedTime(double time) : t(time) {}
|
||
friend ClippedTime TimeClip(double time);
|
||
|
||
public:
|
||
// Create an invalid date.
|
||
ClippedTime() : t(mozilla::UnspecifiedNaN<double>()) {}
|
||
|
||
// Create an invalid date/time, more explicitly; prefer this to the default
|
||
// constructor.
|
||
static ClippedTime invalid() { return ClippedTime(); }
|
||
|
||
double toDouble() const { return t; }
|
||
|
||
bool isValid() const { return !mozilla::IsNaN(t); }
|
||
};
|
||
|
||
// ES6 20.3.1.15.
|
||
//
|
||
// Clip a double to JavaScript's date range (or to an invalid date) using the
|
||
// ECMAScript TimeClip algorithm.
|
||
inline ClippedTime
|
||
TimeClip(double time)
|
||
{
|
||
// Steps 1-2.
|
||
const double MaxTimeMagnitude = 8.64e15;
|
||
if (!mozilla::IsFinite(time) || mozilla::Abs(time) > MaxTimeMagnitude)
|
||
return ClippedTime(mozilla::UnspecifiedNaN<double>());
|
||
|
||
// Step 3.
|
||
return ClippedTime(ToInteger(time) + (+0.0));
|
||
}
|
||
|
||
// Produce a double Value from the given time. Because times may be NaN,
|
||
// prefer using this to manual canonicalization.
|
||
inline Value
|
||
TimeValue(ClippedTime time)
|
||
{
|
||
return DoubleValue(JS::CanonicalizeNaN(time.toDouble()));
|
||
}
|
||
|
||
// Create a new Date object whose [[DateValue]] internal slot contains the
|
||
// clipped |time|. (Users who must represent times outside that range must use
|
||
// another representation.)
|
||
extern JS_PUBLIC_API(JSObject*)
|
||
NewDateObject(JSContext* cx, ClippedTime time);
|
||
|
||
// Year is a year, month is 0-11, day is 1-based. The return value is a number
|
||
// of milliseconds since the epoch.
|
||
//
|
||
// Consistent with the MakeDate algorithm defined in ECMAScript, this value is
|
||
// *not* clipped! Use JS::TimeClip if you need a clipped date.
|
||
JS_PUBLIC_API(double)
|
||
MakeDate(double year, unsigned month, unsigned day);
|
||
|
||
// Takes an integer number of milliseconds since the epoch and returns the
|
||
// year. Can return NaN, and will do so if NaN is passed in.
|
||
JS_PUBLIC_API(double)
|
||
YearFromTime(double time);
|
||
|
||
// Takes an integer number of milliseconds since the epoch and returns the
|
||
// month (0-11). Can return NaN, and will do so if NaN is passed in.
|
||
JS_PUBLIC_API(double)
|
||
MonthFromTime(double time);
|
||
|
||
// Takes an integer number of milliseconds since the epoch and returns the
|
||
// day (1-based). Can return NaN, and will do so if NaN is passed in.
|
||
JS_PUBLIC_API(double)
|
||
DayFromTime(double time);
|
||
|
||
} // namespace JS
|
||
|
||
#endif /* js_Date_h */
|