30#define DUK__DPRINT_PARTS_AND_DPARTS(parts,dparts) do { \
31 DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld, dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \
32 (long) (parts)[0], (long) (parts)[1], \
33 (long) (parts)[2], (long) (parts)[3], \
34 (long) (parts)[4], (long) (parts)[5], \
35 (long) (parts)[6], (long) (parts)[7], \
36 (double) (dparts)[0], (double) (dparts)[1], \
37 (double) (dparts)[2], (double) (dparts)[3], \
38 (double) (dparts)[4], (double) (dparts)[5], \
39 (double) (dparts)[6], (double) (dparts)[7])); \
41#define DUK__DPRINT_PARTS(parts) do { \
42 DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld", \
43 (long) (parts)[0], (long) (parts)[1], \
44 (long) (parts)[2], (long) (parts)[3], \
45 (long) (parts)[4], (long) (parts)[5], \
46 (long) (parts)[6], (long) (parts)[7])); \
48#define DUK__DPRINT_DPARTS(dparts) do { \
49 DUK_D(DUK_DPRINT("dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \
50 (double) (dparts)[0], (double) (dparts)[1], \
51 (double) (dparts)[2], (double) (dparts)[3], \
52 (double) (dparts)[4], (double) (dparts)[5], \
53 (double) (dparts)[6], (double) (dparts)[7])); \
61#define DUK__YEAR(x) ((duk_uint8_t) ((x) - 1970))
98#define DUK__NUM_ISO8601_PARSER_PARTS 9
101#define DUK__PI_YEAR 0
102#define DUK__PI_MONTH 1
104#define DUK__PI_HOUR 3
105#define DUK__PI_MINUTE 4
106#define DUK__PI_SECOND 5
107#define DUK__PI_MILLISECOND 6
108#define DUK__PI_TZHOUR 7
109#define DUK__PI_TZMINUTE 8
112#define DUK__PM_YEAR (1 << DUK__PI_YEAR)
113#define DUK__PM_MONTH (1 << DUK__PI_MONTH)
114#define DUK__PM_DAY (1 << DUK__PI_DAY)
115#define DUK__PM_HOUR (1 << DUK__PI_HOUR)
116#define DUK__PM_MINUTE (1 << DUK__PI_MINUTE)
117#define DUK__PM_SECOND (1 << DUK__PI_SECOND)
118#define DUK__PM_MILLISECOND (1 << DUK__PI_MILLISECOND)
119#define DUK__PM_TZHOUR (1 << DUK__PI_TZHOUR)
120#define DUK__PM_TZMINUTE (1 << DUK__PI_TZMINUTE)
123#define DUK__SI_PLUS 0
124#define DUK__SI_MINUS 1
126#define DUK__SI_SPACE 3
127#define DUK__SI_COLON 4
128#define DUK__SI_PERIOD 5
133#define DUK__SM_PLUS (1 << DUK__SI_PLUS)
134#define DUK__SM_MINUS (1 << DUK__SI_MINUS)
135#define DUK__SM_T (1 << DUK__SI_T)
136#define DUK__SM_SPACE (1 << DUK__SI_SPACE)
137#define DUK__SM_COLON (1 << DUK__SI_COLON)
138#define DUK__SM_PERIOD (1 << DUK__SI_PERIOD)
139#define DUK__SM_Z (1 << DUK__SI_Z)
140#define DUK__SM_NUL (1 << DUK__SI_NUL)
143#define DUK__CF_NEG (1 << 0)
144#define DUK__CF_ACCEPT (1 << 1)
145#define DUK__CF_ACCEPT_NUL (1 << 2)
147#define DUK__PACK_RULE(partmask,sepmask,nextpart,flags) \
148 ((duk_uint32_t) (partmask) + \
149 (((duk_uint32_t) (sepmask)) << 9) + \
150 (((duk_uint32_t) (nextpart)) << 17) + \
151 (((duk_uint32_t) (flags)) << 21))
153#define DUK__UNPACK_RULE(rule,var_nextidx,var_flags) do { \
154 (var_nextidx) = (duk_small_uint_t) (((rule) >> 17) & 0x0f); \
155 (var_flags) = (duk_small_uint_t) ((rule) >> 21); \
158#define DUK__RULE_MASK_PART_SEP 0x1ffffUL
192 const duk_uint8_t *p;
208 p = (
const duk_uint8_t *) str;
220 (
long) part_idx, (
long) ch,
243 while (ndigits < 3) {
248 parts[part_idx] = accum;
265 match_val = (1UL << part_idx) + (1UL << (sep_idx + 9));
272 DUK_DDD(
DUK_DDDPRINT(
"part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, considering rule=0x%08lx",
273 (
long) part_idx, (
long) sep_idx,
274 (
unsigned long) match_val, (
unsigned long) rule));
276 if ((rule & match_val) != match_val) {
283 "rule=0x%08lx -> nextpart=%ld, cflags=0x%02lx",
284 (
long) part_idx, (
long) sep_idx,
285 (
unsigned long) match_val, (
unsigned long) rule,
286 (
long) nextpart, (
unsigned long) cflags));
356 dparts[i] = parts[i];
396#if defined(DUK_USE_DATE_PARSE_STRING)
402 if (DUK_USE_DATE_PARSE_STRING(ctx, str) != 0) {
423 (duk_uint8_t) 31, (duk_uint8_t) 28, (duk_uint8_t) 31, (duk_uint8_t) 30,
424 (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 31,
425 (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31
431#define DUK__LOCAL_TZOFFSET_MAXITER 4
439#define DUK__WEEKDAY_MOD_ADDER (20000000 * 7)
442 if ((year % 4) != 0) {
445 if ((year % 100) != 0) {
448 if ((year % 400) != 0) {
491 return (
a - b + 1) / b;
500 return 365 * (year - 1970)
516 year = 1970 + day / 365;
518 year = 1970 + day / 366;
523 DUK_DDD(
DUK_DDDPRINT(
"year=%ld day=%ld, diff_days=%ld", (
long) year, (
long) day, (
long) diff_days));
524 if (diff_days <= 0) {
526 *out_day_within_year = -diff_days;
528 (
long) year, (
long) *out_day_within_year));
537 year -= 1 + (diff_days - 1) / 366;
584 DUK_DD(
DUK_DDPRINT(
"year not in ecmascript valid range, avoid integer overflow: %lf", (
double) year));
591 for (i = 0; i < n; i++) {
593 if (i == 1 && is_leap) {
646 day_since_epoch = t2;
663 DUK_DDD(
DUK_DDDPRINT(
"d=%lf, d1=%lf, d2=%lf, t1=%ld, t2=%ld, parts: hour=%ld min=%ld sec=%ld msec=%ld",
664 (
double) d, (
double) d1, (
double) d2, (
long) t1, (
long) t2,
680 for (month = 0; month < 12; month++) {
682 if (month == 1 && is_leap) {
686 (
long) month, (
long) dim, (
long) day));
711 jan1_since_epoch = day_since_epoch - day_in_year;
714 DUK_ASSERT(jan1_weekday >= 0 && jan1_weekday <= 6);
715 arridx = jan1_weekday;
723 DUK_DDD(
DUK_DDDPRINT(
"equiv year mapping, year=%ld, day_in_year=%ld, day_since_epoch=%ld, "
724 "jan1_since_epoch=%ld, jan1_weekday=%ld -> equiv year %ld",
725 (
long) year, (
long) day_in_year, (
long) day_since_epoch,
726 (
long) jan1_since_epoch, (
long) jan1_weekday, (
long) equiv_year));
738 if (dparts !=
NULL) {
752#if defined(DUK_USE_PARANOID_DATE_COMPUTATION)
816 (
double) tmp_time, (
double) tmp_day, (
double) d));
837 tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);
846 tzoffprev1 = 999999999L;
848 tzoffprev2 = tzoffprev1;
850 tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d - tzoff * 1000L);
852 (
int) i, (
long) tzoff, (
long) tzoffprev1, (
long) tzoffprev2));
853 if (tzoff == tzoffprev1) {
854 DUK_DDD(
DUK_DDDPRINT(
"tzoffset iteration finished, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld",
855 (
int) i, (
long) tzoff, (
long) tzoffprev1, (
long) tzoffprev2));
857 }
else if (tzoff == tzoffprev2) {
863 DUK_DDD(
DUK_DDDPRINT(
"tzoffset iteration two-value cycle, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld",
864 (
int) i, (
long) tzoff, (
long) tzoffprev1, (
long) tzoffprev2));
865 if (tzoffprev1 > tzoff) {
920 tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);
921 d += tzoffset * 1000L;
924 *out_tzoffset = tzoffset;
971 yearstr[
sizeof(yearstr) - 1] = (
char) 0;
979 DUK_SNPRINTF(tzstr,
sizeof(tzstr),
"+%02d:%02d", (
int) (tmp / 60), (
int) (tmp % 60));
982 DUK_SNPRINTF(tzstr,
sizeof(tzstr),
"-%02d:%02d", (
int) (tmp / 60), (
int) (tmp % 60));
984 tzstr[
sizeof(tzstr) - 1] = (
char) 0;
994 DUK_SPRINTF((
char *) out_buf,
"%s-%02d-%02d%c%02d:%02d:%02d.%03d%s",
1003 DUK_SPRINTF((
char *) out_buf,
"%02d:%02d:%02d.%03d%s",
1006 (
const char *) tzstr);
1040#if defined(DUK_USE_DATE_FORMAT_STRING)
1046 rc = DUK_USE_DATE_FORMAT_STRING(ctx, parts, tzoffset, flags);
1157 for (i = 0; i < maxnargs; i++) {
1162 idx = idx_first + i;
1216 if (d >= 0.0 && d <= 99.0) {
1241 for (i = 0; i < 8; i++) {
1263 (
double) dparts[0], (
double) dparts[1],
1264 (
double) dparts[2], (
double) dparts[3],
1265 (
double) dparts[4], (
double) dparts[5],
1266 (
double) dparts[6], (
double) dparts[7]));
1439 DUK_DDD(
DUK_DDDPRINT(
"Date constructor, nargs=%ld, is_cons=%ld", (
long) nargs, (
long) is_cons));
1450 if (nargs == 0 || !is_cons) {
1459 }
else if (nargs == 1) {
1506 d = DUK_USE_DATE_GET_NOW(ctx);
1658 tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);
#define DUK_UNREACHABLE()
unsigned int duk_small_uint_t
duk_small_int_t duk_ret_t
duk_uint8_t duk_uint_fast8_t
duk_int_fast32_t duk_int_t
#define DUK_MEMZERO(p, n)
duk_small_int_t duk_bool_t
duk_uint32_t duk_uint_fast32_t
#define DUK_ERROR_RANGE(thr, msg)
DUK_EXTERNAL const char * duk_push_string(duk_context *ctx, const char *str)
DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
#define DUK_ERROR_TYPE(thr, msg)
DUK_EXTERNAL void duk_push_this(duk_context *ctx)
DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
DUK_EXTERNAL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_to_primitive(duk_context *ctx, duk_idx_t index, duk_int_t hint)
DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_context *ctx, duk_small_int_t stridx)
#define DUK_BI_DATE_ISO8601_BUFSIZE
#define DUK_HOBJECT_CLASS_DATE
#define DUK_ASSERT_DISABLE(x)
DUK_EXTERNAL void duk_push_null(duk_context *ctx)
DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val)
#define DUK_HOBJECT_CLASS_AS_FLAGS(v)
DUK_EXTERNAL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_dup_top(duk_context *ctx)
DUK_EXTERNAL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_replace(duk_context *ctx, duk_idx_t to_index)
#define DUK_STRIDX_INVALID_DATE
DUK_EXTERNAL void duk_dup(duk_context *ctx, duk_idx_t from_index)
#define DUK_STRIDX_INT_VALUE
DUK_EXTERNAL duk_idx_t duk_get_top(duk_context *ctx)
DUK_EXTERNAL duk_bool_t duk_is_constructor_call(duk_context *ctx)
DUK_EXTERNAL void duk_call_method(duk_context *ctx, duk_idx_t nargs)
DUK_EXTERNAL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_push_number(duk_context *ctx, duk_double_t val)
#define DUK_HOBJECT_FLAG_EXTENSIBLE
DUK_INTERNAL_DECL duk_idx_t duk_push_object_helper(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx)
DUK_EXTERNAL void duk_to_object(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL const char * duk_to_string(duk_context *ctx, duk_idx_t index)
#define DUK_STRIDX_TO_ISO_STRING
DUK_EXTERNAL void duk_pop(duk_context *ctx)
DUK_INTERNAL_DECL duk_hobject * duk_get_hobject(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_GET_CLASS_NUMBER(h)
DUK_EXTERNAL duk_int_t duk_get_current_magic(duk_context *ctx)
DUK_EXTERNAL void duk_push_nan(duk_context *ctx)
DUK_INTERNAL_DECL void duk_xdef_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_uint_t desc_flags)
DUK_EXTERNAL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index)
#define DUK_BIDX_DATE_PROTOTYPE
#define DUK_PROPDESC_FLAGS_W
DUK_EXTERNAL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_double_t duk_js_tointeger_number(duk_double_t x)
#define DUK_DATE_FLAG_SUB1900
#define DUK_DATE_IDX_SECOND
#define DUK_DATE_IDX_YEAR
#define DUK_DATE_FLAG_TOSTRING_DATE
#define DUK_DATE_MSEC_100M_DAYS
#define DUK_DATE_FLAG_EQUIVYEAR
#define DUK_DATE_IDX_HOUR
#define DUK_DATE_IDX_MONTH
#define DUK_DATE_MSEC_100M_DAYS_LEEWAY
#define DUK_DATE_IDX_WEEKDAY
#define DUK_DATE_MIN_ECMA_YEAR
#define DUK_DATE_MSEC_MINUTE
#define DUK_DATE_FLAG_LOCALTIME
#define DUK_DATE_FLAG_TIMESETTER
#define DUK_DATE_FLAG_TOSTRING_LOCALE
#define DUK_DATE_FLAG_TOSTRING_TIME
#define DUK_DATE_MSEC_SECOND
#define DUK_DATE_MSEC_HOUR
#define DUK_DATE_IDX_MINUTE
#define DUK_DATE_FLAG_NAN_TO_RANGE_ERROR
#define DUK_DATE_IDX_MILLISECOND
#define DUK_DATE_IDX_NUM_PARTS
#define DUK_DATE_MSEC_DAY
#define DUK_DATE_FLAG_YEAR_FIXUP
#define DUK_DATE_FLAG_NAN_TO_ZERO
#define DUK_DATE_FLAG_SEP_T
#define DUK_DATE_FLAG_ONEBASED
#define DUK_DATE_MAX_ECMA_YEAR
#define DUK_DATE_FLAG_VALUE_SHIFT
#define DUK__LOCAL_TZOFFSET_MAXITER
DUK_LOCAL const duk_uint32_t duk__parse_iso8601_control[]
DUK_LOCAL duk_int_t duk__year_from_day(duk_int_t day, duk_small_int_t *out_day_within_year)
DUK_INTERNAL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year)
DUK_INTERNAL duk_ret_t duk_bi_date_constructor_utc(duk_context *ctx)
DUK_LOCAL void duk__set_parts_from_args(duk_context *ctx, duk_double_t *dparts, duk_idx_t nargs)
#define DUK__CF_ACCEPT_NUL
DUK_INTERNAL duk_ret_t duk_bi_date_constructor(duk_context *ctx)
DUK_INTERNAL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags)
DUK_LOCAL duk_ret_t duk__parse_string(duk_context *ctx, const char *str)
DUK_INTERNAL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t x)
DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x)
DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval_tzoffset(duk_context *ctx, duk_small_uint_t flags, duk_int_t *out_tzoffset)
DUK_INTERNAL duk_ret_t duk_bi_date_constructor_parse(duk_context *ctx)
#define DUK__UNPACK_RULE(rule, var_nextidx, var_flags)
DUK_LOCAL const duk_uint8_t duk__parse_iso8601_seps[]
#define DUK__PACK_RULE(partmask, sepmask, nextpart, flags)
DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x)
DUK_LOCAL_DECL duk_ret_t duk__set_this_timeval_from_dparts(duk_context *ctx, duk_double_t *dparts, duk_small_uint_t flags)
#define DUK__NUM_ISO8601_PARSER_PARTS
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_context *ctx)
DUK_INTERNAL duk_ret_t duk_bi_date_constructor_now(duk_context *ctx)
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_value_of(duk_context *ctx)
DUK_LOCAL duk_int_t duk__day_from_year(duk_int_t year)
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_shared(duk_context *ctx)
#define DUK__WEEKDAY_MOD_ADDER
DUK_LOCAL duk_ret_t duk__set_part_helper(duk_context *ctx, duk_small_uint_t flags_and_maxnargs)
DUK_LOCAL duk_uint8_t duk__date_equivyear[14]
DUK_LOCAL duk_bool_t duk__parse_string_iso8601_subset(duk_context *ctx, const char *str)
DUK_LOCAL void duk__format_parts_iso8601(duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags, duk_uint8_t *out_buf)
DUK_LOCAL duk_ret_t duk__to_string_helper(duk_context *ctx, duk_small_uint_t flags)
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_to_json(duk_context *ctx)
DUK_INTERNAL void duk_bi_date_format_timeval(duk_double_t timeval, duk_uint8_t *out_buf)
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_shared(duk_context *ctx)
DUK_LOCAL duk_uint8_t duk__days_in_month[12]
DUK_LOCAL duk_double_t duk__make_day(duk_double_t year, duk_double_t month, duk_double_t day)
static duk_uint16_t duk__date_magics[]
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_context *ctx)
DUK_LOCAL_DECL void duk__twodigit_year_fixup(duk_context *ctx, duk_idx_t idx_val)
DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_time(duk_context *ctx)
DUK_INTERNAL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags)
#define DUK__PM_MILLISECOND
DUK_LOCAL duk_double_t duk__timeclip(duk_double_t x)
DUK_LOCAL duk_ret_t duk__get_part_helper(duk_context *ctx, duk_small_uint_t flags_and_idx)
DUK_LOCAL duk_int_t duk__div_floor(duk_int_t a, duk_int_t b)
#define DUK__PI_MILLISECOND
DUK_LOCAL duk_small_uint_t duk__date_get_indirect_magic(duk_context *ctx)
DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval(duk_context *ctx, duk_small_uint_t flags)