Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7639 views
1
#include "jsi.h"
2
#include "jsvalue.h"
3
#include "jsbuiltin.h"
4
5
#include <time.h>
6
7
#if defined(__unix__)
8
#include <sys/time.h>
9
#elif defined(_WIN32)
10
#include <sys/timeb.h>
11
#endif
12
13
#define js_optnumber(J,I,V) (js_gettop(J) > I ? js_tonumber(J,I) : V)
14
15
static double Now(void)
16
{
17
#if defined(__unix__)
18
struct timeval tv;
19
gettimeofday(&tv, NULL);
20
return floor(tv.tv_sec * 1000.0 + tv.tv_usec / 1000.0);
21
#elif defined(_WIN32)
22
struct _timeb tv;
23
_ftime(&tv);
24
return tv.time * 1000.0 + tv.millitm;
25
#else
26
return time(NULL) * 1000.0;
27
#endif
28
}
29
30
static double LocalTZA(void)
31
{
32
static int once = 1;
33
static double tza = 0;
34
if (once) {
35
time_t now = time(NULL);
36
time_t utc = mktime(gmtime(&now));
37
time_t loc = mktime(localtime(&now));
38
tza = (loc - utc) * 1000;
39
once = 0;
40
}
41
return tza;
42
}
43
44
static double DaylightSavingTA(double t)
45
{
46
return 0; // TODO
47
}
48
49
/* Helpers from the ECMA 262 specification */
50
51
#define HoursPerDay 24.0
52
#define MinutesPerDay (HoursPerDay * MinutesPerHour)
53
#define MinutesPerHour 60.0
54
#define SecondsPerDay (MinutesPerDay * SecondsPerMinute)
55
#define SecondsPerHour (MinutesPerHour * SecondsPerMinute)
56
#define SecondsPerMinute 60.0
57
58
#define msPerDay (SecondsPerDay * msPerSecond)
59
#define msPerHour (SecondsPerHour * msPerSecond)
60
#define msPerMinute (SecondsPerMinute * msPerSecond)
61
#define msPerSecond 1000.0
62
63
static double pmod(double x, double y)
64
{
65
x = fmod(x, y);
66
if (x < 0)
67
x += y;
68
return x;
69
}
70
71
static int Day(double t)
72
{
73
return floor(t / msPerDay);
74
}
75
76
static double TimeWithinDay(double t)
77
{
78
return pmod(t, msPerDay);
79
}
80
81
static int DaysInYear(int y)
82
{
83
return y % 4 == 0 && (y % 100 || (y % 400 == 0)) ? 366 : 365;
84
}
85
86
static int DayFromYear(int y)
87
{
88
return 365 * (y - 1970) +
89
floor((y - 1969) / 4.0) -
90
floor((y - 1901) / 100.0) +
91
floor((y - 1601) / 400.0);
92
}
93
94
static double TimeFromYear(int y)
95
{
96
return DayFromYear(y) * msPerDay;
97
}
98
99
static int YearFromTime(double t)
100
{
101
int y = floor(t / (msPerDay * 365.2425)) + 1970;
102
double t2 = TimeFromYear(y);
103
if (t2 > t)
104
--y;
105
else if (t2 + msPerDay * DaysInYear(y) <= t)
106
++y;
107
return y;
108
}
109
110
static int InLeapYear(int t)
111
{
112
return DaysInYear(YearFromTime(t)) == 366;
113
}
114
115
static int DayWithinYear(double t)
116
{
117
return Day(t) - DayFromYear(YearFromTime(t));
118
}
119
120
static int MonthFromTime(double t)
121
{
122
int day = DayWithinYear(t);
123
int leap = InLeapYear(t);
124
if (day < 31) return 0;
125
if (day < 59 + leap) return 1;
126
if (day < 90 + leap) return 2;
127
if (day < 120 + leap) return 3;
128
if (day < 151 + leap) return 4;
129
if (day < 181 + leap) return 5;
130
if (day < 212 + leap) return 6;
131
if (day < 243 + leap) return 7;
132
if (day < 273 + leap) return 8;
133
if (day < 304 + leap) return 9;
134
if (day < 334 + leap) return 10;
135
return 11;
136
}
137
138
static int DateFromTime(double t)
139
{
140
int day = DayWithinYear(t);
141
int leap = InLeapYear(t);
142
switch (MonthFromTime(t)) {
143
case 0: return day + 1;
144
case 1: return day - 30;
145
case 2: return day - 58 - leap;
146
case 3: return day - 89 - leap;
147
case 4: return day - 119 - leap;
148
case 5: return day - 150 - leap;
149
case 6: return day - 180 - leap;
150
case 7: return day - 211 - leap;
151
case 8: return day - 242 - leap;
152
case 9: return day - 272 - leap;
153
case 10: return day - 303 - leap;
154
default : return day - 333 - leap;
155
}
156
}
157
158
static int WeekDay(double t)
159
{
160
return pmod(Day(t) + 4, 7);
161
}
162
163
static double LocalTime(double utc)
164
{
165
return utc + LocalTZA() + DaylightSavingTA(utc);
166
}
167
168
static double UTC(double loc)
169
{
170
return loc - LocalTZA() - DaylightSavingTA(loc - LocalTZA());
171
}
172
173
static int HourFromTime(double t)
174
{
175
return pmod(floor(t / msPerHour), HoursPerDay);
176
}
177
178
static int MinFromTime(double t)
179
{
180
return pmod(floor(t / msPerMinute), MinutesPerHour);
181
}
182
183
static int SecFromTime(double t)
184
{
185
return pmod(floor(t / msPerSecond), SecondsPerMinute);
186
}
187
188
static int msFromTime(double t)
189
{
190
return pmod(t, msPerSecond);
191
}
192
193
static double MakeTime(double hour, double min, double sec, double ms)
194
{
195
return ((hour * MinutesPerHour + min) * SecondsPerMinute + sec) * msPerSecond + ms;
196
}
197
198
static double MakeDay(double y, double m, double date)
199
{
200
/*
201
* The following array contains the day of year for the first day of
202
* each month, where index 0 is January, and day 0 is January 1.
203
*/
204
static const double firstDayOfMonth[2][12] = {
205
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
206
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}
207
};
208
209
double yd, md;
210
211
y += floor(m / 12);
212
m = pmod(m, 12);
213
214
yd = floor(TimeFromYear(y) / msPerDay);
215
md = firstDayOfMonth[InLeapYear(y)][(int)m];
216
217
return yd + md + date - 1;
218
}
219
220
static double MakeDate(double day, double time)
221
{
222
return day * msPerDay + time;
223
}
224
225
static double TimeClip(double t)
226
{
227
if (!isfinite(t))
228
return NAN;
229
if (abs(t) > 8.64e15)
230
return NAN;
231
return t < 0 ? -floor(-t) : floor(t);
232
}
233
234
static int toint(const char **sp, int w, int *v)
235
{
236
const char *s = *sp;
237
*v = 0;
238
while (w--) {
239
if (*s < '0' || *s > '9')
240
return 0;
241
*v = *v * 10 + (*s++ - '0');
242
}
243
*sp = s;
244
return 1;
245
}
246
247
static double parseDateTime(const char *s)
248
{
249
int y = 1970, m = 1, d = 1, H = 0, M = 0, S = 0, ms = 0;
250
int tza = 0;
251
double t;
252
253
/* Parse ISO 8601 formatted date and time: */
254
/* YYYY("-"MM("-"DD)?)?("T"HH":"mm(":"ss("."sss)?)?("Z"|[+-]HH(":"mm)?)?)? */
255
256
if (!toint(&s, 4, &y)) return NAN;
257
if (*s == '-') {
258
s += 1;
259
if (!toint(&s, 2, &m)) return NAN;
260
if (*s == '-') {
261
s += 1;
262
if (!toint(&s, 2, &d)) return NAN;
263
}
264
}
265
266
if (*s == 'T') {
267
s += 1;
268
if (!toint(&s, 2, &H)) return NAN;
269
if (*s != ':') return NAN;
270
s += 1;
271
if (!toint(&s, 2, &M)) return NAN;
272
if (*s == ':') {
273
s += 1;
274
if (!toint(&s, 2, &S)) return NAN;
275
if (*s == '.') {
276
s += 1;
277
if (!toint(&s, 3, &ms)) return NAN;
278
}
279
}
280
if (*s == 'Z') {
281
s += 1;
282
tza = 0;
283
} else if (*s == '+' || *s == '-') {
284
int tzh = 0, tzm = 0;
285
int tzs = *s == '+' ? 1 : -1;
286
s += 1;
287
if (!toint(&s, 2, &tzh)) return NAN;
288
if (*s == ':') {
289
s += 1;
290
if (!toint(&s, 2, &tzm)) return NAN;
291
}
292
if (tzh > 23 || tzm > 59) return NAN;
293
tza = tzs * (tzh * msPerHour + tzm * msPerMinute);
294
} else {
295
tza = LocalTZA();
296
}
297
}
298
299
if (*s) return NAN;
300
301
if (m > 11) return NAN;
302
if (d < 1 || d > 31) return NAN;
303
if (H > 24 || M > 59 || S > 59) return NAN;
304
if (H == 24 && (M != 0 || S != 0 || ms != 0)) return NAN;
305
306
// TODO: DaylightSavingTA on local times
307
t = MakeDate(MakeDay(y, m-1, d), MakeTime(H, M, S, ms));
308
return t - tza;
309
}
310
311
/* date formatting */
312
313
static char *fmtdate(char *buf, double t)
314
{
315
int y = YearFromTime(t);
316
int m = MonthFromTime(t);
317
int d = DateFromTime(t);
318
if (!isfinite(t))
319
return "Invalid Date";
320
sprintf(buf, "%04d-%02d-%02d", y, m+1, d);
321
return buf;
322
}
323
324
static char *fmttime(char *buf, double t, double tza)
325
{
326
int H = HourFromTime(t);
327
int M = MinFromTime(t);
328
int S = SecFromTime(t);
329
int ms = msFromTime(t);
330
int tzh = HourFromTime(fabs(tza));
331
int tzm = MinFromTime(fabs(tza));
332
if (!isfinite(t))
333
return "Invalid Date";
334
if (tza == 0)
335
sprintf(buf, "%02d:%02d:%02d.%03dZ", H, M, S, ms);
336
else if (tza < 0)
337
sprintf(buf, "%02d:%02d:%02d.%03d-%02d:%02d", H, M, S, ms, tzh, tzm);
338
else
339
sprintf(buf, "%02d:%02d:%02d.%03d+%02d:%02d", H, M, S, ms, tzh, tzm);
340
return buf;
341
}
342
343
static char *fmtdatetime(char *buf, double t, double tza)
344
{
345
char dbuf[20], tbuf[20];
346
if (!isfinite(t))
347
return "Invalid Date";
348
fmtdate(dbuf, t);
349
fmttime(tbuf, t, tza);
350
sprintf(buf, "%sT%s", dbuf, tbuf);
351
return buf;
352
}
353
354
/* Date functions */
355
356
static double js_todate(js_State *J, int idx)
357
{
358
js_Object *self = js_toobject(J, idx);
359
if (self->type != JS_CDATE)
360
js_typeerror(J, "not a date");
361
return self->u.number;
362
}
363
364
static void js_setdate(js_State *J, int idx, double t)
365
{
366
js_Object *self = js_toobject(J, idx);
367
if (self->type != JS_CDATE)
368
js_typeerror(J, "not a date");
369
self->u.number = TimeClip(t);
370
js_pushnumber(J, self->u.number);
371
}
372
373
static void D_parse(js_State *J)
374
{
375
double t = parseDateTime(js_tostring(J, 1));
376
js_pushnumber(J, t);
377
}
378
379
static void D_UTC(js_State *J)
380
{
381
double y, m, d, H, M, S, ms, t;
382
y = js_tonumber(J, 1);
383
if (y < 100) y += 1900;
384
m = js_tonumber(J, 2);
385
d = js_optnumber(J, 3, 1);
386
H = js_optnumber(J, 4, 0);
387
M = js_optnumber(J, 5, 0);
388
S = js_optnumber(J, 6, 0);
389
ms = js_optnumber(J, 7, 0);
390
t = MakeDate(MakeDay(y, m, d), MakeTime(H, M, S, ms));
391
t = TimeClip(t);
392
js_pushnumber(J, t);
393
}
394
395
static void D_now(js_State *J)
396
{
397
js_pushnumber(J, Now());
398
}
399
400
static void jsB_Date(js_State *J)
401
{
402
char buf[64];
403
js_pushstring(J, fmtdatetime(buf, LocalTime(Now()), LocalTZA()));
404
}
405
406
static void jsB_new_Date(js_State *J)
407
{
408
unsigned int top = js_gettop(J);
409
js_Object *obj;
410
double t;
411
412
if (top == 1)
413
t = Now();
414
else if (top == 2) {
415
js_toprimitive(J, 1, JS_HNONE);
416
if (js_isstring(J, 1))
417
t = parseDateTime(js_tostring(J, 1));
418
else
419
t = TimeClip(js_tonumber(J, 1));
420
} else {
421
double y, m, d, H, M, S, ms;
422
y = js_tonumber(J, 1);
423
if (y < 100) y += 1900;
424
m = js_tonumber(J, 2);
425
d = js_optnumber(J, 3, 1);
426
H = js_optnumber(J, 4, 0);
427
M = js_optnumber(J, 5, 0);
428
S = js_optnumber(J, 6, 0);
429
ms = js_optnumber(J, 7, 0);
430
t = MakeDate(MakeDay(y, m, d), MakeTime(H, M, S, ms));
431
t = TimeClip(UTC(t));
432
}
433
434
obj = jsV_newobject(J, JS_CDATE, J->Date_prototype);
435
obj->u.number = t;
436
437
js_pushobject(J, obj);
438
}
439
440
static void Dp_valueOf(js_State *J)
441
{
442
double t = js_todate(J, 0);
443
js_pushnumber(J, t);
444
}
445
446
static void Dp_toString(js_State *J)
447
{
448
char buf[64];
449
double t = js_todate(J, 0);
450
js_pushstring(J, fmtdatetime(buf, LocalTime(t), LocalTZA()));
451
}
452
453
static void Dp_toDateString(js_State *J)
454
{
455
char buf[64];
456
double t = js_todate(J, 0);
457
js_pushstring(J, fmtdate(buf, LocalTime(t)));
458
}
459
460
static void Dp_toTimeString(js_State *J)
461
{
462
char buf[64];
463
double t = js_todate(J, 0);
464
js_pushstring(J, fmttime(buf, LocalTime(t), LocalTZA()));
465
}
466
467
static void Dp_toUTCString(js_State *J)
468
{
469
char buf[64];
470
double t = js_todate(J, 0);
471
js_pushstring(J, fmtdatetime(buf, t, 0));
472
}
473
474
static void Dp_toISOString(js_State *J)
475
{
476
char buf[64];
477
double t = js_todate(J, 0);
478
if (!isfinite(t))
479
js_rangeerror(J, "invalid date");
480
js_pushstring(J, fmtdatetime(buf, t, 0));
481
}
482
483
static void Dp_getFullYear(js_State *J)
484
{
485
double t = js_todate(J, 0);
486
js_pushnumber(J, YearFromTime(LocalTime(t)));
487
}
488
489
static void Dp_getMonth(js_State *J)
490
{
491
double t = js_todate(J, 0);
492
js_pushnumber(J, MonthFromTime(LocalTime(t)));
493
}
494
495
static void Dp_getDate(js_State *J)
496
{
497
double t = js_todate(J, 0);
498
js_pushnumber(J, DateFromTime(LocalTime(t)));
499
}
500
501
static void Dp_getDay(js_State *J)
502
{
503
double t = js_todate(J, 0);
504
js_pushnumber(J, WeekDay(LocalTime(t)));
505
}
506
507
static void Dp_getHours(js_State *J)
508
{
509
double t = js_todate(J, 0);
510
js_pushnumber(J, HourFromTime(LocalTime(t)));
511
}
512
513
static void Dp_getMinutes(js_State *J)
514
{
515
double t = js_todate(J, 0);
516
js_pushnumber(J, MinFromTime(LocalTime(t)));
517
}
518
519
static void Dp_getSeconds(js_State *J)
520
{
521
double t = js_todate(J, 0);
522
js_pushnumber(J, SecFromTime(LocalTime(t)));
523
}
524
525
static void Dp_getMilliseconds(js_State *J)
526
{
527
double t = js_todate(J, 0);
528
js_pushnumber(J, msFromTime(LocalTime(t)));
529
}
530
531
static void Dp_getUTCFullYear(js_State *J)
532
{
533
double t = js_todate(J, 0);
534
js_pushnumber(J, YearFromTime(t));
535
}
536
537
static void Dp_getUTCMonth(js_State *J)
538
{
539
double t = js_todate(J, 0);
540
js_pushnumber(J, MonthFromTime(t));
541
}
542
543
static void Dp_getUTCDate(js_State *J)
544
{
545
double t = js_todate(J, 0);
546
js_pushnumber(J, DateFromTime(t));
547
}
548
549
static void Dp_getUTCDay(js_State *J)
550
{
551
double t = js_todate(J, 0);
552
js_pushnumber(J, WeekDay(t));
553
}
554
555
static void Dp_getUTCHours(js_State *J)
556
{
557
double t = js_todate(J, 0);
558
js_pushnumber(J, HourFromTime(t));
559
}
560
561
static void Dp_getUTCMinutes(js_State *J)
562
{
563
double t = js_todate(J, 0);
564
js_pushnumber(J, MinFromTime(t));
565
}
566
567
static void Dp_getUTCSeconds(js_State *J)
568
{
569
double t = js_todate(J, 0);
570
js_pushnumber(J, SecFromTime(t));
571
}
572
573
static void Dp_getUTCMilliseconds(js_State *J)
574
{
575
double t = js_todate(J, 0);
576
js_pushnumber(J, msFromTime(t));
577
}
578
579
static void Dp_getTimezoneOffset(js_State *J)
580
{
581
double t = js_todate(J, 0);
582
js_pushnumber(J, (t - LocalTime(t)) / msPerMinute);
583
}
584
585
static void Dp_setTime(js_State *J)
586
{
587
js_setdate(J, 0, js_tonumber(J, 1));
588
}
589
590
static void Dp_setMilliseconds(js_State *J)
591
{
592
double t = LocalTime(js_todate(J, 0));
593
double h = HourFromTime(t);
594
double m = MinFromTime(t);
595
double s = SecFromTime(t);
596
double ms = js_tonumber(J, 1);
597
js_setdate(J, 0, UTC(MakeDate(Day(t), MakeTime(h, m, s, ms))));
598
}
599
600
static void Dp_setSeconds(js_State *J)
601
{
602
double t = LocalTime(js_todate(J, 0));
603
double h = HourFromTime(t);
604
double m = MinFromTime(t);
605
double s = js_tonumber(J, 1);
606
double ms = js_optnumber(J, 2, msFromTime(t));
607
js_setdate(J, 0, UTC(MakeDate(Day(t), MakeTime(h, m, s, ms))));
608
}
609
610
static void Dp_setMinutes(js_State *J)
611
{
612
double t = LocalTime(js_todate(J, 0));
613
double h = HourFromTime(t);
614
double m = js_tonumber(J, 1);
615
double s = js_optnumber(J, 2, SecFromTime(t));
616
double ms = js_optnumber(J, 3, msFromTime(t));
617
js_setdate(J, 0, UTC(MakeDate(Day(t), MakeTime(h, m, s, ms))));
618
}
619
620
static void Dp_setHours(js_State *J)
621
{
622
double t = LocalTime(js_todate(J, 0));
623
double h = js_tonumber(J, 1);
624
double m = js_optnumber(J, 2, HourFromTime(t));
625
double s = js_optnumber(J, 3, SecFromTime(t));
626
double ms = js_optnumber(J, 4, msFromTime(t));
627
js_setdate(J, 0, UTC(MakeDate(Day(t), MakeTime(h, m, s, ms))));
628
}
629
630
static void Dp_setDate(js_State *J)
631
{
632
double t = LocalTime(js_todate(J, 0));
633
double y = YearFromTime(t);
634
double m = MonthFromTime(t);
635
double d = js_tonumber(J, 1);
636
js_setdate(J, 0, UTC(MakeDate(MakeDay(y, m, d), TimeWithinDay(t))));
637
}
638
639
static void Dp_setMonth(js_State *J)
640
{
641
double t = LocalTime(js_todate(J, 0));
642
double y = YearFromTime(t);
643
double m = js_tonumber(J, 1);
644
double d = js_optnumber(J, 3, DateFromTime(t));
645
js_setdate(J, 0, UTC(MakeDate(MakeDay(y, m, d), TimeWithinDay(t))));
646
}
647
648
static void Dp_setFullYear(js_State *J)
649
{
650
double t = LocalTime(js_todate(J, 0));
651
double y = js_tonumber(J, 1);
652
double m = js_optnumber(J, 2, MonthFromTime(t));
653
double d = js_optnumber(J, 3, DateFromTime(t));
654
js_setdate(J, 0, UTC(MakeDate(MakeDay(y, m, d), TimeWithinDay(t))));
655
}
656
657
static void Dp_setUTCMilliseconds(js_State *J)
658
{
659
double t = js_todate(J, 0);
660
double h = HourFromTime(t);
661
double m = MinFromTime(t);
662
double s = SecFromTime(t);
663
double ms = js_tonumber(J, 1);
664
js_setdate(J, 0, MakeDate(Day(t), MakeTime(h, m, s, ms)));
665
}
666
667
static void Dp_setUTCSeconds(js_State *J)
668
{
669
double t = js_todate(J, 0);
670
double h = HourFromTime(t);
671
double m = MinFromTime(t);
672
double s = js_tonumber(J, 1);
673
double ms = js_optnumber(J, 2, msFromTime(t));
674
js_setdate(J, 0, MakeDate(Day(t), MakeTime(h, m, s, ms)));
675
}
676
677
static void Dp_setUTCMinutes(js_State *J)
678
{
679
double t = js_todate(J, 0);
680
double h = HourFromTime(t);
681
double m = js_tonumber(J, 1);
682
double s = js_optnumber(J, 2, SecFromTime(t));
683
double ms = js_optnumber(J, 3, msFromTime(t));
684
js_setdate(J, 0, MakeDate(Day(t), MakeTime(h, m, s, ms)));
685
}
686
687
static void Dp_setUTCHours(js_State *J)
688
{
689
double t = js_todate(J, 0);
690
double h = js_tonumber(J, 1);
691
double m = js_optnumber(J, 2, HourFromTime(t));
692
double s = js_optnumber(J, 3, SecFromTime(t));
693
double ms = js_optnumber(J, 4, msFromTime(t));
694
js_setdate(J, 0, MakeDate(Day(t), MakeTime(h, m, s, ms)));
695
}
696
697
static void Dp_setUTCDate(js_State *J)
698
{
699
double t = js_todate(J, 0);
700
double y = YearFromTime(t);
701
double m = MonthFromTime(t);
702
double d = js_tonumber(J, 1);
703
js_setdate(J, 0, MakeDate(MakeDay(y, m, d), TimeWithinDay(t)));
704
}
705
706
static void Dp_setUTCMonth(js_State *J)
707
{
708
double t = js_todate(J, 0);
709
double y = YearFromTime(t);
710
double m = js_tonumber(J, 1);
711
double d = js_optnumber(J, 3, DateFromTime(t));
712
js_setdate(J, 0, MakeDate(MakeDay(y, m, d), TimeWithinDay(t)));
713
}
714
715
static void Dp_setUTCFullYear(js_State *J)
716
{
717
double t = js_todate(J, 0);
718
double y = js_tonumber(J, 1);
719
double m = js_optnumber(J, 2, MonthFromTime(t));
720
double d = js_optnumber(J, 3, DateFromTime(t));
721
js_setdate(J, 0, MakeDate(MakeDay(y, m, d), TimeWithinDay(t)));
722
}
723
724
static void Dp_toJSON(js_State *J)
725
{
726
js_copy(J, 0);
727
js_toprimitive(J, -1, JS_HNUMBER);
728
if (js_isnumber(J, -1) && !isfinite(js_tonumber(J, -1))) {
729
js_pushnull(J);
730
return;
731
}
732
js_pop(J, 1);
733
734
js_getproperty(J, 0, "toISOString");
735
if (!js_iscallable(J, -1))
736
js_typeerror(J, "Date.prototype.toJSON: this.toISOString not a function");
737
js_copy(J, 0);
738
js_call(J, 0);
739
}
740
741
void jsB_initdate(js_State *J)
742
{
743
J->Date_prototype->u.number = 0;
744
745
js_pushobject(J, J->Date_prototype);
746
{
747
jsB_propf(J, "valueOf", Dp_valueOf, 0);
748
jsB_propf(J, "toString", Dp_toString, 0);
749
jsB_propf(J, "toDateString", Dp_toDateString, 0);
750
jsB_propf(J, "toTimeString", Dp_toTimeString, 0);
751
jsB_propf(J, "toLocaleString", Dp_toString, 0);
752
jsB_propf(J, "toLocaleDateString", Dp_toDateString, 0);
753
jsB_propf(J, "toLocaleTimeString", Dp_toTimeString, 0);
754
jsB_propf(J, "toUTCString", Dp_toUTCString, 0);
755
756
jsB_propf(J, "getTime", Dp_valueOf, 0);
757
jsB_propf(J, "getFullYear", Dp_getFullYear, 0);
758
jsB_propf(J, "getUTCFullYear", Dp_getUTCFullYear, 0);
759
jsB_propf(J, "getMonth", Dp_getMonth, 0);
760
jsB_propf(J, "getUTCMonth", Dp_getUTCMonth, 0);
761
jsB_propf(J, "getDate", Dp_getDate, 0);
762
jsB_propf(J, "getUTCDate", Dp_getUTCDate, 0);
763
jsB_propf(J, "getDay", Dp_getDay, 0);
764
jsB_propf(J, "getUTCDay", Dp_getUTCDay, 0);
765
jsB_propf(J, "getHours", Dp_getHours, 0);
766
jsB_propf(J, "getUTCHours", Dp_getUTCHours, 0);
767
jsB_propf(J, "getMinutes", Dp_getMinutes, 0);
768
jsB_propf(J, "getUTCMinutes", Dp_getUTCMinutes, 0);
769
jsB_propf(J, "getSeconds", Dp_getSeconds, 0);
770
jsB_propf(J, "getUTCSeconds", Dp_getUTCSeconds, 0);
771
jsB_propf(J, "getMilliseconds", Dp_getMilliseconds, 0);
772
jsB_propf(J, "getUTCMilliseconds", Dp_getUTCMilliseconds, 0);
773
jsB_propf(J, "getTimezoneOffset", Dp_getTimezoneOffset, 0);
774
775
jsB_propf(J, "setTime", Dp_setTime, 1);
776
jsB_propf(J, "setMilliseconds", Dp_setMilliseconds, 1);
777
jsB_propf(J, "setUTCMilliseconds", Dp_setUTCMilliseconds, 1);
778
jsB_propf(J, "setSeconds", Dp_setSeconds, 2);
779
jsB_propf(J, "setUTCSeconds", Dp_setUTCSeconds, 2);
780
jsB_propf(J, "setMinutes", Dp_setMinutes, 3);
781
jsB_propf(J, "setUTCMinutes", Dp_setUTCMinutes, 3);
782
jsB_propf(J, "setHours", Dp_setHours, 4);
783
jsB_propf(J, "setUTCHours", Dp_setUTCHours, 4);
784
jsB_propf(J, "setDate", Dp_setDate, 1);
785
jsB_propf(J, "setUTCDate", Dp_setUTCDate, 1);
786
jsB_propf(J, "setMonth", Dp_setMonth, 2);
787
jsB_propf(J, "setUTCMonth", Dp_setUTCMonth, 2);
788
jsB_propf(J, "setFullYear", Dp_setFullYear, 3);
789
jsB_propf(J, "setUTCFullYear", Dp_setUTCFullYear, 3);
790
791
/* ES5 */
792
jsB_propf(J, "toISOString", Dp_toISOString, 0);
793
jsB_propf(J, "toJSON", Dp_toJSON, 1);
794
}
795
js_newcconstructor(J, jsB_Date, jsB_new_Date, "Date", 1);
796
{
797
jsB_propf(J, "parse", D_parse, 1);
798
jsB_propf(J, "UTC", D_UTC, 7);
799
800
/* ES5 */
801
jsB_propf(J, "now", D_now, 0);
802
}
803
js_defglobal(J, "Date", JS_DONTENUM);
804
}
805
806