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:
Jeff Walden
2015-04-30 09:58:58 -07:00
parent a97eec0c4d
commit 41198d06ee
2 changed files with 133 additions and 7 deletions

View File

@@ -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;
}