ref: d11c71072e86425f98c24a45be8af9aacbe0ff08
parent: d3a99000e0d502eeb659631c661fe4dccd24a452
author: Tor Andersson <tor.andersson@artifex.com>
date: Wed Feb 3 12:07:28 EST 2021
Bug 703458: Handle NaN in Date accessors.
--- a/jsdate.c
+++ b/jsdate.c
@@ -491,103 +491,154 @@
static void Dp_getFullYear(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, YearFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, YearFromTime(LocalTime(t)));
}
static void Dp_getMonth(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, MonthFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, MonthFromTime(LocalTime(t)));
}
static void Dp_getDate(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, DateFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, DateFromTime(LocalTime(t)));
}
static void Dp_getDay(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, WeekDay(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, WeekDay(LocalTime(t)));
}
static void Dp_getHours(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, HourFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, HourFromTime(LocalTime(t)));
}
static void Dp_getMinutes(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, MinFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, MinFromTime(LocalTime(t)));
}
static void Dp_getSeconds(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, SecFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, SecFromTime(LocalTime(t)));
}
static void Dp_getMilliseconds(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, msFromTime(LocalTime(t)));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, msFromTime(LocalTime(t)));
}
static void Dp_getUTCFullYear(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, YearFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, YearFromTime(t));
}
static void Dp_getUTCMonth(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, MonthFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, MonthFromTime(t));
}
static void Dp_getUTCDate(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, DateFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, DateFromTime(t));
}
static void Dp_getUTCDay(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, WeekDay(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, WeekDay(t));
}
static void Dp_getUTCHours(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, HourFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, HourFromTime(t));
}
static void Dp_getUTCMinutes(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, MinFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, MinFromTime(t));
}
static void Dp_getUTCSeconds(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, SecFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, SecFromTime(t));
}
static void Dp_getUTCMilliseconds(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, msFromTime(t));
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, msFromTime(t));
}
static void Dp_getTimezoneOffset(js_State *J)
{
double t = js_todate(J, 0);
- js_pushnumber(J, (t - LocalTime(t)) / msPerMinute);
+ if (isnan(t))
+ js_pushnumber(J, NAN);
+ else
+ js_pushnumber(J, (t - LocalTime(t)) / msPerMinute);
}
static void Dp_setTime(js_State *J)