Bug 1160356 - Make Date.UTC conform to ES3-6 in converting *all* arguments to number before computing the return value. r=evilpie
This commit is contained in:
@@ -614,21 +614,77 @@ date_msecFromArgs(JSContext* cx, CallArgs args, double* rval)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* See ECMA 15.9.4.[3-10];
|
||||
*/
|
||||
/* ES6 20.3.3.4. */
|
||||
static bool
|
||||
date_UTC(JSContext* cx, unsigned argc, Value* vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
double msec_time;
|
||||
if (!date_msecFromArgs(cx, args, &msec_time))
|
||||
// Steps 1-2.
|
||||
double y;
|
||||
if (!ToNumber(cx, args.get(0), &y))
|
||||
return false;
|
||||
|
||||
msec_time = TimeClip(msec_time);
|
||||
// Steps 3-4.
|
||||
double m;
|
||||
if (!ToNumber(cx, args.get(1), &m))
|
||||
return false;
|
||||
|
||||
args.rval().setNumber(msec_time);
|
||||
// Steps 5-6.
|
||||
double dt;
|
||||
if (args.length() >= 3) {
|
||||
if (!ToNumber(cx, args[2], &dt))
|
||||
return false;
|
||||
} else {
|
||||
dt = 1;
|
||||
}
|
||||
|
||||
// Steps 7-8.
|
||||
double h;
|
||||
if (args.length() >= 4) {
|
||||
if (!ToNumber(cx, args[3], &h))
|
||||
return false;
|
||||
} else {
|
||||
h = 0;
|
||||
}
|
||||
|
||||
// Steps 9-10.
|
||||
double min;
|
||||
if (args.length() >= 5) {
|
||||
if (!ToNumber(cx, args[4], &min))
|
||||
return false;
|
||||
} else {
|
||||
min = 0;
|
||||
}
|
||||
|
||||
// Steps 11-12.
|
||||
double s;
|
||||
if (args.length() >= 6) {
|
||||
if (!ToNumber(cx, args[5], &s))
|
||||
return false;
|
||||
} else {
|
||||
s = 0;
|
||||
}
|
||||
|
||||
// Steps 13-14.
|
||||
double milli;
|
||||
if (args.length() >= 7) {
|
||||
if (!ToNumber(cx, args[6], &milli))
|
||||
return false;
|
||||
} else {
|
||||
milli = 0;
|
||||
}
|
||||
|
||||
// Step 15.
|
||||
double yr = y;
|
||||
if (!IsNaN(y)) {
|
||||
double yint = ToInteger(y);
|
||||
if (0 <= yint && yint <= 99)
|
||||
yr = 1900 + yint;
|
||||
}
|
||||
|
||||
// Step 16.
|
||||
args.rval().setDouble(TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user