porffor 0.2.0-eeb45f8 → 0.2.0-ef043de
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +159 -88
- package/asur/README.md +2 -0
- package/asur/index.js +1262 -0
- package/byg/index.js +237 -0
- package/compiler/2c.js +317 -72
- package/compiler/{sections.js → assemble.js} +63 -15
- package/compiler/builtins/annexb_string.js +72 -0
- package/compiler/builtins/annexb_string.ts +19 -0
- package/compiler/builtins/array.ts +145 -0
- package/compiler/builtins/base64.ts +151 -0
- package/compiler/builtins/crypto.ts +120 -0
- package/compiler/builtins/date.ts +1370 -0
- package/compiler/builtins/escape.ts +141 -0
- package/compiler/builtins/int.ts +147 -0
- package/compiler/builtins/number.ts +527 -0
- package/compiler/builtins/porffor.d.ts +42 -0
- package/compiler/builtins/string.ts +1055 -0
- package/compiler/builtins/tostring.ts +45 -0
- package/compiler/builtins.js +470 -269
- package/compiler/{codeGen.js → codegen.js} +958 -370
- package/compiler/embedding.js +22 -22
- package/compiler/encoding.js +108 -10
- package/compiler/generated_builtins.js +1262 -0
- package/compiler/index.js +36 -34
- package/compiler/log.js +6 -3
- package/compiler/opt.js +50 -36
- package/compiler/parse.js +35 -27
- package/compiler/precompile.js +123 -0
- package/compiler/prefs.js +26 -0
- package/compiler/prototype.js +13 -28
- package/compiler/types.js +37 -0
- package/compiler/wasmSpec.js +28 -8
- package/compiler/wrap.js +51 -46
- package/fib.js +7 -0
- package/package.json +9 -5
- package/porf +4 -0
- package/rhemyn/compile.js +5 -3
- package/rhemyn/parse.js +323 -320
- package/rhemyn/test/parse.js +58 -58
- package/runner/compare.js +34 -34
- package/runner/debug.js +122 -0
- package/runner/index.js +62 -10
- package/runner/profiler.js +102 -0
- package/runner/repl.js +40 -7
- package/runner/sizes.js +37 -37
- package/compiler/builtins/base64.js +0 -92
- package/runner/info.js +0 -89
- package/runner/profile.js +0 -46
- package/runner/results.json +0 -1
- package/runner/transform.js +0 -15
- package/util/enum.js +0 -20
@@ -0,0 +1,1370 @@
|
|
1
|
+
// @porf -funsafe-no-unlikely-proto-checks
|
2
|
+
|
3
|
+
// 21.4.1.3 Day (t)
|
4
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-day
|
5
|
+
// 1. Return 𝔽(floor(ℝ(t / msPerDay))).
|
6
|
+
export const __ecma262_Day = (t: number): number => Math.floor(t / 86400000);
|
7
|
+
|
8
|
+
// 21.4.1.4 TimeWithinDay (t)
|
9
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-day
|
10
|
+
// 1. Return 𝔽(ℝ(t) modulo ℝ(msPerDay)).
|
11
|
+
export const __ecma262_TimeWithinDay = (t: number): number => t % 86400000;
|
12
|
+
|
13
|
+
// 21.4.1.5 DaysInYear (y)
|
14
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-daysinyear
|
15
|
+
export const __ecma262_DaysInYear = (y: number): number => {
|
16
|
+
// 1. Let ry be ℝ(y).
|
17
|
+
|
18
|
+
// 2. If (ry modulo 400) = 0, return 366𝔽.
|
19
|
+
if (y % 400 == 0) return 366;
|
20
|
+
|
21
|
+
// 3. If (ry modulo 100) = 0, return 365𝔽.
|
22
|
+
if (y % 100 == 0) return 365;
|
23
|
+
|
24
|
+
// 4. If (ry modulo 4) = 0, return 366𝔽.
|
25
|
+
if (y % 4 == 0) return 366;
|
26
|
+
|
27
|
+
// 5. Return 365𝔽.
|
28
|
+
return 365;
|
29
|
+
};
|
30
|
+
|
31
|
+
// 21.4.1.6 DayFromYear (y)
|
32
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-dayfromyear
|
33
|
+
export const __ecma262_DayFromYear = (y: number): number => {
|
34
|
+
// 1. Let ry be ℝ(y).
|
35
|
+
// 2. NOTE: In the following steps, numYears1, numYears4, numYears100, and numYears400
|
36
|
+
// represent the number of years divisible by 1, 4, 100, and 400, respectively,
|
37
|
+
// that occur between the epoch and the start of year y.
|
38
|
+
// The number is negative if y is before the epoch.
|
39
|
+
|
40
|
+
// 3. Let numYears1 be (ry - 1970).
|
41
|
+
const numYears1: number = y - 1970;
|
42
|
+
|
43
|
+
// 4. Let numYears4 be floor((ry - 1969) / 4).
|
44
|
+
const numYears4: number = Math.floor((y - 1969) / 4);
|
45
|
+
|
46
|
+
// 5. Let numYears100 be floor((ry - 1901) / 100).
|
47
|
+
const numYears100: number = Math.floor((y - 1901) / 100);
|
48
|
+
|
49
|
+
// 6. Let numYears400 be floor((ry - 1601) / 400).
|
50
|
+
const numYears400: number = Math.floor((y - 1601) / 400);
|
51
|
+
|
52
|
+
// 7. Return 𝔽(365 × numYears1 + numYears4 - numYears100 + numYears400).
|
53
|
+
return 365 * numYears1 + numYears4 - numYears100 + numYears400;
|
54
|
+
};
|
55
|
+
|
56
|
+
// 21.4.1.7 TimeFromYear (y)
|
57
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-timefromyear
|
58
|
+
// 1. Return msPerDay × DayFromYear(y).
|
59
|
+
export const __ecma262_TimeFromYear = (y: number): number => 86400000 * __ecma262_DayFromYear(y);
|
60
|
+
|
61
|
+
// 21.4.1.8 YearFromTime (t)
|
62
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-yearfromtime
|
63
|
+
export const __ecma262_YearFromTime = (t: number): number => {
|
64
|
+
// 1. Return the largest integral Number y (closest to +∞) such that TimeFromYear(y) ≤ t.
|
65
|
+
|
66
|
+
// guess year with floor(t / (365.2425 * msPerDay)) + 1970
|
67
|
+
const y: number = Math.floor(t / 31556952000) + 1970;
|
68
|
+
|
69
|
+
// get timestamp for guessed year
|
70
|
+
const t2: number = __ecma262_TimeFromYear(y);
|
71
|
+
|
72
|
+
// if timestamp is higher, we guessed too high
|
73
|
+
if (t2 > t) return y - 1;
|
74
|
+
|
75
|
+
// if timestamp + days in year is lower, we guessed too low
|
76
|
+
if ((t2 + __ecma262_DaysInYear(y) * 86400000) <= t) return y + 1;
|
77
|
+
|
78
|
+
// we guessed correct
|
79
|
+
return y;
|
80
|
+
};
|
81
|
+
|
82
|
+
// 21.4.1.9 DayWithinYear (t)
|
83
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-daywithinyear
|
84
|
+
// 1. Return Day(t) - DayFromYear(YearFromTime(t)).
|
85
|
+
export const __ecma262_DayWithinYear = (t: number): number => __ecma262_Day(t) - __ecma262_DayFromYear(__ecma262_YearFromTime(t));
|
86
|
+
|
87
|
+
// 21.4.1.10 InLeapYear (t)
|
88
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-inleapyear
|
89
|
+
// 1. If DaysInYear(YearFromTime(t)) is 366𝔽, return 1𝔽; else return +0𝔽.
|
90
|
+
export const __ecma262_InLeapYear = (t: number): number => __ecma262_DaysInYear(__ecma262_YearFromTime(t)) == 366 ? 1 : 0;
|
91
|
+
|
92
|
+
// 21.4.1.11 MonthFromTime (t)
|
93
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-monthfromtime
|
94
|
+
export const __ecma262_MonthFromTime = (t: number): number => {
|
95
|
+
// 1. Let inLeapYear be InLeapYear(t).
|
96
|
+
const inLeapYear: number = __ecma262_InLeapYear(t);
|
97
|
+
|
98
|
+
// 2. Let dayWithinYear be DayWithinYear(t).
|
99
|
+
const dayWithinYear: number = __ecma262_DayWithinYear(t);
|
100
|
+
|
101
|
+
// 3. If dayWithinYear < 31𝔽, return +0𝔽.
|
102
|
+
if (dayWithinYear < 31) return 0;
|
103
|
+
|
104
|
+
// 4. If dayWithinYear < 59𝔽 + inLeapYear, return 1𝔽.
|
105
|
+
if (dayWithinYear < 59 + inLeapYear) return 1;
|
106
|
+
|
107
|
+
// 5. If dayWithinYear < 90𝔽 + inLeapYear, return 2𝔽.
|
108
|
+
if (dayWithinYear < 90 + inLeapYear) return 2;
|
109
|
+
|
110
|
+
// 6. If dayWithinYear < 120𝔽 + inLeapYear, return 3𝔽.
|
111
|
+
if (dayWithinYear < 120 + inLeapYear) return 3;
|
112
|
+
|
113
|
+
// 7. If dayWithinYear < 151𝔽 + inLeapYear, return 4𝔽.
|
114
|
+
if (dayWithinYear < 151 + inLeapYear) return 4;
|
115
|
+
|
116
|
+
// 8. If dayWithinYear < 181𝔽 + inLeapYear, return 5𝔽.
|
117
|
+
if (dayWithinYear < 181 + inLeapYear) return 5;
|
118
|
+
|
119
|
+
// 9. If dayWithinYear < 212𝔽 + inLeapYear, return 6𝔽.
|
120
|
+
if (dayWithinYear < 212 + inLeapYear) return 6;
|
121
|
+
|
122
|
+
// 10. If dayWithinYear < 243𝔽 + inLeapYear, return 7𝔽.
|
123
|
+
if (dayWithinYear < 243 + inLeapYear) return 7;
|
124
|
+
|
125
|
+
// 11. If dayWithinYear < 273𝔽 + inLeapYear, return 8𝔽.
|
126
|
+
if (dayWithinYear < 273 + inLeapYear) return 8;
|
127
|
+
|
128
|
+
// 12. If dayWithinYear < 304𝔽 + inLeapYear, return 9𝔽.
|
129
|
+
if (dayWithinYear < 304 + inLeapYear) return 9;
|
130
|
+
|
131
|
+
// 13. If dayWithinYear < 334𝔽 + inLeapYear, return 10𝔽.
|
132
|
+
if (dayWithinYear < 334 + inLeapYear) return 10;
|
133
|
+
|
134
|
+
// 14. Assert: dayWithinYear < 365𝔽 + inLeapYear.
|
135
|
+
|
136
|
+
// 15. Return 11𝔽.
|
137
|
+
return 11;
|
138
|
+
};
|
139
|
+
|
140
|
+
// 21.4.1.12 DateFromTime (t)
|
141
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-datefromtime
|
142
|
+
export const __ecma262_DateFromTime = (t: number): number => {
|
143
|
+
// 1. Let inLeapYear be InLeapYear(t).
|
144
|
+
const inLeapYear: number = __ecma262_InLeapYear(t);
|
145
|
+
|
146
|
+
// 2. Let dayWithinYear be DayWithinYear(t).
|
147
|
+
const dayWithinYear: number = __ecma262_DayWithinYear(t);
|
148
|
+
|
149
|
+
// 3. Let month be MonthFromTime(t).
|
150
|
+
const month = __ecma262_MonthFromTime(t);
|
151
|
+
|
152
|
+
// 4. If month is +0𝔽, return dayWithinYear + 1𝔽.
|
153
|
+
if (month == 0) return dayWithinYear + 1;
|
154
|
+
|
155
|
+
// 5. If month is 1𝔽, return dayWithinYear - 30𝔽.
|
156
|
+
if (month == 1) return dayWithinYear - 30;
|
157
|
+
|
158
|
+
// 6. If month is 2𝔽, return dayWithinYear - 58𝔽 - inLeapYear.
|
159
|
+
if (month == 2) return dayWithinYear - 58 - inLeapYear;
|
160
|
+
|
161
|
+
// 7. If month is 3𝔽, return dayWithinYear - 89𝔽 - inLeapYear.
|
162
|
+
if (month == 3) return dayWithinYear - 89 - inLeapYear;
|
163
|
+
|
164
|
+
// 8. If month is 4𝔽, return dayWithinYear - 119𝔽 - inLeapYear.
|
165
|
+
if (month == 4) return dayWithinYear - 119 - inLeapYear;
|
166
|
+
|
167
|
+
// 9. If month is 5𝔽, return dayWithinYear - 150𝔽 - inLeapYear.
|
168
|
+
if (month == 5) return dayWithinYear - 150 - inLeapYear;
|
169
|
+
|
170
|
+
// 10. If month is 6𝔽, return dayWithinYear - 180𝔽 - inLeapYear.
|
171
|
+
if (month == 6) return dayWithinYear - 180 - inLeapYear;
|
172
|
+
|
173
|
+
// 11. If month is 7𝔽, return dayWithinYear - 211𝔽 - inLeapYear.
|
174
|
+
if (month == 7) return dayWithinYear - 211 - inLeapYear;
|
175
|
+
|
176
|
+
// 12. If month is 8𝔽, return dayWithinYear - 242𝔽 - inLeapYear.
|
177
|
+
if (month == 8) return dayWithinYear - 242 - inLeapYear;
|
178
|
+
|
179
|
+
// 13. If month is 9𝔽, return dayWithinYear - 272𝔽 - inLeapYear.
|
180
|
+
if (month == 9) return dayWithinYear - 272 - inLeapYear;
|
181
|
+
|
182
|
+
// 14. If month is 10𝔽, return dayWithinYear - 303𝔽 - inLeapYear.
|
183
|
+
if (month == 10) return dayWithinYear - 303 - inLeapYear;
|
184
|
+
|
185
|
+
// 15. Assert: month is 11𝔽.
|
186
|
+
|
187
|
+
// 16. Return dayWithinYear - 333𝔽 - inLeapYear.
|
188
|
+
return dayWithinYear - 333 - inLeapYear;
|
189
|
+
};
|
190
|
+
|
191
|
+
// 21.4.1.13 WeekDay (t)
|
192
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-weekday
|
193
|
+
// 1. Return 𝔽(ℝ(Day(t) + 4𝔽) modulo 7).
|
194
|
+
export const __ecma262_WeekDay = (t: number): number => (__ecma262_Day(t) + 4) % 7;
|
195
|
+
|
196
|
+
// 21.4.1.14 HourFromTime (t)
|
197
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-hourfromtime
|
198
|
+
// 1. Return 𝔽(floor(ℝ(t / msPerHour)) modulo HoursPerDay).
|
199
|
+
export const __ecma262_HourFromTime = (t: number): number => Math.floor(t / 3600000) % 24;
|
200
|
+
|
201
|
+
// 21.4.1.15 MinFromTime (t)
|
202
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-minfromtime
|
203
|
+
// 1. Return 𝔽(floor(ℝ(t / msPerMinute)) modulo MinutesPerHour).
|
204
|
+
export const __ecma262_MinFromTime = (t: number): number => Math.floor(t / 60000) % 60;
|
205
|
+
|
206
|
+
// 21.4.1.16 SecFromTime (t)
|
207
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-secfromtime
|
208
|
+
// 1. Return 𝔽(floor(ℝ(t / msPerSecond)) modulo SecondsPerMinute).
|
209
|
+
export const __ecma262_SecFromTime = (t: number): number => Math.floor(t / 1000) % 60;
|
210
|
+
|
211
|
+
// 21.4.1.17 msFromTime (t)
|
212
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-msfromtime
|
213
|
+
// 1. Return 𝔽(ℝ(t) modulo ℝ(msPerSecond)).
|
214
|
+
export const __ecma262_msFromTime = (t: number): number => t % 1000;
|
215
|
+
|
216
|
+
|
217
|
+
// // 21.4.1.21 GetNamedTimeZoneOffsetNanoseconds (timeZoneIdentifier, epochNanoseconds)
|
218
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-getnamedtimezoneoffsetnanoseconds
|
219
|
+
// export const __ecma262_GetNamedTimeZoneOffsetNanoseconds = (timeZoneIdentifier: bytestring, epochNanoseconds: number /* BigInt (unused) */): number => {
|
220
|
+
// // 1. Assert: timeZoneIdentifier is "UTC".
|
221
|
+
|
222
|
+
// // 2. Return 0.
|
223
|
+
// return 0;
|
224
|
+
// };
|
225
|
+
|
226
|
+
// // 21.4.1.23 AvailableNamedTimeZoneIdentifiers ()
|
227
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-availablenamedtimezoneidentifiers
|
228
|
+
// export const __ecma262_AvailableNamedTimeZoneIdentifiers = (): bytestring[] => {
|
229
|
+
// // 1. If the implementation does not include local political rules for any time zones, then
|
230
|
+
// // a. Return « the Time Zone Identifier Record { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } ».
|
231
|
+
// return [ 'UTC' ];
|
232
|
+
// };
|
233
|
+
|
234
|
+
// // 21.4.1.24 SystemTimeZoneIdentifier ()
|
235
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-systemtimezoneidentifier
|
236
|
+
// export const __ecma262_SystemTimeZoneIdentifier = (): bytestring => {
|
237
|
+
// // 1. If the implementation only supports the UTC time zone, return "UTC".
|
238
|
+
// return 'UTC';
|
239
|
+
// };
|
240
|
+
|
241
|
+
// 21.4.1.25 LocalTime (t)
|
242
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-localtime
|
243
|
+
// slightly break spec here by just simplifying the abstraction for if implementation does not include local political rules for any time zones
|
244
|
+
export const __ecma262_LocalTime = (t: number): number => t;
|
245
|
+
|
246
|
+
// 21.4.1.26 UTC (t)
|
247
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-utc-t
|
248
|
+
// slightly break spec here by just simplifying the abstraction for if implementation does not include local political rules for any time zones
|
249
|
+
export const __ecma262_UTC = (t: number): number => {
|
250
|
+
// 1. If t is not finite, return NaN.
|
251
|
+
if (!Number.isFinite(t)) return NaN;
|
252
|
+
|
253
|
+
return t;
|
254
|
+
};
|
255
|
+
|
256
|
+
|
257
|
+
// todo: move this somewhere generic?
|
258
|
+
// 7.1.5 ToIntegerOrInfinity (argument)
|
259
|
+
// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tointegerorinfinity
|
260
|
+
export const __ecma262_ToIntegerOrInfinity = (argument: unknown): number => {
|
261
|
+
// 1. Let number be ? ToNumber(argument).
|
262
|
+
const number: number = Number(argument);
|
263
|
+
|
264
|
+
// 2. If number is one of NaN, +0𝔽, or -0𝔽, return 0.
|
265
|
+
if (Number.isNaN(number)) return 0;
|
266
|
+
|
267
|
+
// 3. If number is +∞𝔽, return +∞.
|
268
|
+
// 4. If number is -∞𝔽, return -∞.
|
269
|
+
// if (!Number.isFinite(number)) return number;
|
270
|
+
|
271
|
+
// 5. Return truncate(ℝ(number)).
|
272
|
+
return Math.trunc(number);
|
273
|
+
};
|
274
|
+
|
275
|
+
// 21.4.1.27 MakeTime (hour, min, sec, ms)
|
276
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-maketime
|
277
|
+
export const __ecma262_MakeTime = (hour: number, min: number, sec: number, ms: number): number => {
|
278
|
+
// 1. If hour is not finite, min is not finite, sec is not finite, or ms is not finite, return NaN.
|
279
|
+
if (Porffor.fastOr(!Number.isFinite(hour), !Number.isFinite(min), !Number.isFinite(sec), !Number.isFinite(ms))) return NaN;
|
280
|
+
|
281
|
+
// 2. Let h be 𝔽(! ToIntegerOrInfinity(hour)).
|
282
|
+
const h: number = __ecma262_ToIntegerOrInfinity(hour);
|
283
|
+
// 3. Let m be 𝔽(! ToIntegerOrInfinity(min)).
|
284
|
+
const m: number = __ecma262_ToIntegerOrInfinity(min);
|
285
|
+
// 4. Let s be 𝔽(! ToIntegerOrInfinity(sec)).
|
286
|
+
const s: number = __ecma262_ToIntegerOrInfinity(sec);
|
287
|
+
// 5. Let milli be 𝔽(! ToIntegerOrInfinity(ms)).
|
288
|
+
const milli: number = __ecma262_ToIntegerOrInfinity(ms);
|
289
|
+
|
290
|
+
// 6. Return ((h × msPerHour + m × msPerMinute) + s × msPerSecond) + milli.
|
291
|
+
return ((h * 3600000 + m * 60000) + s * 1000) + milli;
|
292
|
+
};
|
293
|
+
|
294
|
+
// 21.4.1.28 MakeDay (year, month, date)
|
295
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-makeday
|
296
|
+
export const __ecma262_MakeDay = (year: number, month: number, date: number): number => {
|
297
|
+
// 1. If year is not finite, month is not finite, or date is not finite, return NaN.
|
298
|
+
if (Porffor.fastOr(!Number.isFinite(year), !Number.isFinite(month), !Number.isFinite(date))) return NaN;
|
299
|
+
|
300
|
+
// 2. Let y be 𝔽(! ToIntegerOrInfinity(year)).
|
301
|
+
const y: number = __ecma262_ToIntegerOrInfinity(year);
|
302
|
+
// 3. Let m be 𝔽(! ToIntegerOrInfinity(month)).
|
303
|
+
const m: number = __ecma262_ToIntegerOrInfinity(month);
|
304
|
+
// 4. Let dt be 𝔽(! ToIntegerOrInfinity(date)).
|
305
|
+
const dt: number = __ecma262_ToIntegerOrInfinity(date);
|
306
|
+
|
307
|
+
// 5. Let ym be y + 𝔽(floor(ℝ(m) / 12)).
|
308
|
+
let ym: number = y + Math.floor(m / 12);
|
309
|
+
|
310
|
+
// 6. If ym is not finite, return NaN.
|
311
|
+
if (!Number.isFinite(ym)) return NaN;
|
312
|
+
|
313
|
+
// 7. Let mn be 𝔽(ℝ(m) modulo 12).
|
314
|
+
const mn: number = m % 12;
|
315
|
+
|
316
|
+
// 8. Find a finite time value t such that YearFromTime(t) is ym, MonthFromTime(t) is mn, and DateFromTime(t) is 1𝔽; but if this is not possible (because some argument is out of range), return NaN.
|
317
|
+
|
318
|
+
// https://howardhinnant.github.io/date_algorithms.html#days_from_civil
|
319
|
+
if (mn <= 1) ym -= 1;
|
320
|
+
|
321
|
+
const era: number = Math.trunc((ym >= 0 ? ym : (ym - 399)) / 400);
|
322
|
+
const yoe: number = ym - era * 400;
|
323
|
+
const doy: number = Math.trunc((153 * (mn + (mn > 1 ? -2 : 10)) + 2) / 5);
|
324
|
+
const doe: number = yoe * 365 + Math.trunc(yoe / 4) - Math.trunc(yoe / 100) + doy;
|
325
|
+
const day: number = era * 146097 + doe - 719468;
|
326
|
+
|
327
|
+
// 9. Return Day(t) + dt - 1𝔽.
|
328
|
+
// day = Day(t) (our day calculated is already as day)
|
329
|
+
return day + dt - 1;
|
330
|
+
};
|
331
|
+
|
332
|
+
// 21.4.1.29 MakeDate (day, time)
|
333
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-makedate
|
334
|
+
export const __ecma262_MakeDate = (day: number, time: number): number => {
|
335
|
+
// 1. If day is not finite or time is not finite, return NaN.
|
336
|
+
if (Porffor.fastOr(!Number.isFinite(day), !Number.isFinite(time))) return NaN;
|
337
|
+
|
338
|
+
// 2. Let tv be day × msPerDay + time.
|
339
|
+
const tv: number = day * 86400000 + time;
|
340
|
+
|
341
|
+
// 3. If tv is not finite, return NaN.
|
342
|
+
if (!Number.isFinite(tv)) return NaN;
|
343
|
+
|
344
|
+
// 4. Return tv.
|
345
|
+
return tv;
|
346
|
+
};
|
347
|
+
|
348
|
+
// 21.4.1.30 MakeFullYear (year)
|
349
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-makefullyear
|
350
|
+
export const __ecma262_MakeFullYear = (year: number): number => {
|
351
|
+
// 1. If year is NaN, return NaN.
|
352
|
+
if (Number.isNaN(year)) return NaN;
|
353
|
+
|
354
|
+
// 2. Let truncated be ! ToIntegerOrInfinity(year).
|
355
|
+
const truncated: number = __ecma262_ToIntegerOrInfinity(year);
|
356
|
+
|
357
|
+
// 3. If truncated is in the inclusive interval from 0 to 99, return 1900𝔽 + 𝔽(truncated).
|
358
|
+
if (truncated >= 0 && truncated <= 99) return 1900 + truncated;
|
359
|
+
|
360
|
+
// 4. Return 𝔽(truncated).
|
361
|
+
return truncated;
|
362
|
+
};
|
363
|
+
|
364
|
+
|
365
|
+
// 21.4.1.31 TimeClip (time)
|
366
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-timeclip
|
367
|
+
export const __ecma262_TimeClip = (time: number): number => {
|
368
|
+
// 1. If time is not finite, return NaN.
|
369
|
+
if (!Number.isFinite(time)) return NaN;
|
370
|
+
|
371
|
+
// 2. If abs(ℝ(time)) > 8.64 × 10**15, return NaN.
|
372
|
+
if (Math.abs(time) > 8.64e+15) return NaN;
|
373
|
+
|
374
|
+
// 3. Return 𝔽(! ToIntegerOrInfinity(time)).
|
375
|
+
return __ecma262_ToIntegerOrInfinity(time);
|
376
|
+
};
|
377
|
+
|
378
|
+
|
379
|
+
// 21.4.2.1 Date (...values)
|
380
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date
|
381
|
+
export const Date = (): bytestring => {
|
382
|
+
// 1. If NewTarget is undefined, then
|
383
|
+
// a. Let now be the time value (UTC) identifying the current time.
|
384
|
+
// b. Return ToDateString(now).
|
385
|
+
// return Date$constructor().toString();
|
386
|
+
return '';
|
387
|
+
};
|
388
|
+
|
389
|
+
// dark wasm magic for a basic allocator, sorry.
|
390
|
+
export const __Porffor_date_allocate = (): Date => {
|
391
|
+
const hack: bytestring = '';
|
392
|
+
|
393
|
+
if (hack.length == 0) {
|
394
|
+
hack.length = Porffor.wasm`i32.const 1
|
395
|
+
memory.grow 0
|
396
|
+
drop
|
397
|
+
memory.size 0
|
398
|
+
i32.const 1
|
399
|
+
i32.sub
|
400
|
+
i32.const 65536
|
401
|
+
i32.mul
|
402
|
+
i32.from_u`;
|
403
|
+
}
|
404
|
+
|
405
|
+
const ptr: number = hack.length;
|
406
|
+
hack.length = ptr + 8;
|
407
|
+
|
408
|
+
return ptr;
|
409
|
+
};
|
410
|
+
|
411
|
+
export const __Porffor_date_read = (ptr: Date): number => Porffor.wasm.f64.load(ptr, 0, 0);
|
412
|
+
export const __Porffor_date_write = (ptr: Date, val: number) => {
|
413
|
+
Porffor.wasm.f64.store(ptr, val, 0, 0);
|
414
|
+
};
|
415
|
+
|
416
|
+
|
417
|
+
export const Date$constructor = (v0: unknown, v1: unknown, v2: unknown, v3: unknown, v4: unknown, v5: unknown, v6: unknown): Date => {
|
418
|
+
// todo: passing undefined to params should not act like no arg was passed
|
419
|
+
|
420
|
+
// 2. Let numberOfArgs be the number of elements in values.
|
421
|
+
// sorry.
|
422
|
+
const numberOfArgs: i32 =
|
423
|
+
(Porffor.rawType(v0) != Porffor.TYPES.undefined) +
|
424
|
+
(Porffor.rawType(v1) != Porffor.TYPES.undefined) +
|
425
|
+
(Porffor.rawType(v2) != Porffor.TYPES.undefined) +
|
426
|
+
(Porffor.rawType(v3) != Porffor.TYPES.undefined) +
|
427
|
+
(Porffor.rawType(v4) != Porffor.TYPES.undefined) +
|
428
|
+
(Porffor.rawType(v5) != Porffor.TYPES.undefined) +
|
429
|
+
(Porffor.rawType(v6) != Porffor.TYPES.undefined);
|
430
|
+
|
431
|
+
let dv: number = 0;
|
432
|
+
|
433
|
+
// 3. If numberOfArgs = 0, then
|
434
|
+
if (numberOfArgs == 0) {
|
435
|
+
// a. Let dv be the time value (UTC) identifying the current time.
|
436
|
+
dv = __Date_now();
|
437
|
+
} else if (numberOfArgs == 1) {
|
438
|
+
// 4. Else if numberOfArgs = 1, the n
|
439
|
+
// a. Let value be values[0].
|
440
|
+
const value: any = v0;
|
441
|
+
|
442
|
+
const valueType: i32 = Porffor.rawType(v0);
|
443
|
+
|
444
|
+
let tv: number = 0;
|
445
|
+
|
446
|
+
// b. If value is an Object and value has a [[DateValue]] internal slot, then
|
447
|
+
if (valueType == Porffor.TYPES._date) {
|
448
|
+
// i. Let tv be value.[[DateValue]].
|
449
|
+
tv = __Porffor_date_read(value);
|
450
|
+
} else {
|
451
|
+
// c. Else,
|
452
|
+
// ii. If v is a String, then
|
453
|
+
if (valueType == Porffor.TYPES.string || valueType == Porffor.TYPES._bytestring) {
|
454
|
+
// 1. Assert: The next step never returns an abrupt completion because v is a String.
|
455
|
+
|
456
|
+
// 2. Let tv be the result of parsing v as a date, in exactly the same manner as for the parse method (21.4.3.2).
|
457
|
+
// todo
|
458
|
+
} else {
|
459
|
+
// iii. Else,
|
460
|
+
// 1. Let tv be ? ToNumber(v).
|
461
|
+
tv = Number(value);
|
462
|
+
}
|
463
|
+
}
|
464
|
+
|
465
|
+
// d. Let dv be TimeClip(tv).
|
466
|
+
dv = __ecma262_TimeClip(tv);
|
467
|
+
} else {
|
468
|
+
// 5. Else,
|
469
|
+
// a. Assert: numberOfArgs ≥ 2.
|
470
|
+
|
471
|
+
// b. Let y be ? ToNumber(values[0]).
|
472
|
+
const y: number = Number(v0);
|
473
|
+
|
474
|
+
// c. Let m be ? ToNumber(values[1]).
|
475
|
+
const m: number = Number(v1);
|
476
|
+
|
477
|
+
// d. If numberOfArgs > 2, let dt be ? ToNumber(values[2]); else let dt be 1𝔽.
|
478
|
+
let dt: number = 1;
|
479
|
+
if (numberOfArgs > 2) dt = Number(v2);
|
480
|
+
|
481
|
+
// e. If numberOfArgs > 3, let h be ? ToNumber(values[3]); else let h be +0𝔽.
|
482
|
+
let h: number = 0;
|
483
|
+
if (numberOfArgs > 3) h = Number(v3);
|
484
|
+
|
485
|
+
// f. If numberOfArgs > 4, let min be ? ToNumber(values[4]); else let min be +0𝔽.
|
486
|
+
let min: number = 0;
|
487
|
+
if (numberOfArgs > 4) min = Number(v4);
|
488
|
+
|
489
|
+
// g. If numberOfArgs > 5, let s be ? ToNumber(values[5]); else let s be +0𝔽.
|
490
|
+
let s: number = 0;
|
491
|
+
if (numberOfArgs > 5) s = Number(v5);
|
492
|
+
|
493
|
+
// h. If numberOfArgs > 6, let milli be ? ToNumber(values[6]); else let milli be +0𝔽.
|
494
|
+
let milli: number = 0;
|
495
|
+
if (numberOfArgs > 6) milli = Number(v6);
|
496
|
+
|
497
|
+
// i. Let yr be MakeFullYear(y).
|
498
|
+
const yr: number = __ecma262_MakeFullYear(y);
|
499
|
+
|
500
|
+
// j. Let finalDate be MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)).
|
501
|
+
const finalDate: number = __ecma262_MakeDate(__ecma262_MakeDay(yr, m, dt), __ecma262_MakeTime(h, min, s, milli));
|
502
|
+
|
503
|
+
// k. Let dv be TimeClip(UTC(finalDate)).
|
504
|
+
dv = __ecma262_TimeClip(__ecma262_UTC(finalDate));
|
505
|
+
}
|
506
|
+
|
507
|
+
// 6. Let O be ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »).
|
508
|
+
const O: Date = __Porffor_date_allocate();
|
509
|
+
|
510
|
+
// 7. Set O.[[DateValue]] to dv.
|
511
|
+
__Porffor_date_write(O, dv);
|
512
|
+
|
513
|
+
// 8. Return O.
|
514
|
+
return O;
|
515
|
+
};
|
516
|
+
|
517
|
+
|
518
|
+
// 21.4.3.1 Date.now ()
|
519
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.now
|
520
|
+
// This function returns the time value designating the UTC date and time of the occurrence of the call to it.
|
521
|
+
export const __Date_now = (): number => Math.trunc(performance.timeOrigin + performance.now());
|
522
|
+
|
523
|
+
// 21.4.3.2 Date.parse (string)
|
524
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.parse
|
525
|
+
// todo
|
526
|
+
|
527
|
+
// 21.4.3.4 Date.UTC (year [, month [, date [, hours [, minutes [, seconds [, ms ]]]]]])
|
528
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.utc
|
529
|
+
export const __Date_UTC = (year: unknown, month: unknown, date: unknown, hours: unknown, minutes: unknown, seconds: unknown, ms: unknown): number => {
|
530
|
+
// todo: passing undefined to params should not act like no arg was passed
|
531
|
+
|
532
|
+
// 1. Let y be ? ToNumber(year).
|
533
|
+
const y: number = Number(year);
|
534
|
+
|
535
|
+
// 2. If month is present, let m be ? ToNumber(month); else let m be +0𝔽.
|
536
|
+
let m: number = 0;
|
537
|
+
if (Porffor.rawType(month) != Porffor.TYPES.undefined) m = Number(month);
|
538
|
+
|
539
|
+
// 3. If date is present, let dt be ? ToNumber(date); else let dt be 1𝔽.
|
540
|
+
let dt: number = 1;
|
541
|
+
if (Porffor.rawType(date) != Porffor.TYPES.undefined) dt = Number(date);
|
542
|
+
|
543
|
+
// 4. If hours is present, let h be ? ToNumber(hours); else let h be +0𝔽.
|
544
|
+
let h: number = 0;
|
545
|
+
if (Porffor.rawType(hours) != Porffor.TYPES.undefined) h = Number(hours);
|
546
|
+
|
547
|
+
// 5. If minutes is present, let min be ? ToNumber(minutes); else let min be +0𝔽.
|
548
|
+
let min: number = 0;
|
549
|
+
if (Porffor.rawType(minutes) != Porffor.TYPES.undefined) min = Number(minutes);
|
550
|
+
|
551
|
+
// 6. If seconds is present, let s be ? ToNumber(seconds); else let s be +0𝔽.
|
552
|
+
let s: number = 0;
|
553
|
+
if (Porffor.rawType(seconds) != Porffor.TYPES.undefined) s = Number(seconds);
|
554
|
+
|
555
|
+
// 7. If ms is present, let milli be ? ToNumber(ms); else let milli be +0𝔽.
|
556
|
+
let milli: number = 0;
|
557
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) h = Number(ms);
|
558
|
+
|
559
|
+
// 8. Let yr be MakeFullYear(y).
|
560
|
+
const yr: number = __ecma262_MakeFullYear(y);
|
561
|
+
|
562
|
+
// 9. Return TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))).
|
563
|
+
return __ecma262_TimeClip(__ecma262_MakeDate(__ecma262_MakeDay(yr, m, dt), __ecma262_MakeTime(h, min, s, milli)));
|
564
|
+
};
|
565
|
+
|
566
|
+
// 21.4.4 Properties of the Date Prototype Object
|
567
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-properties-of-the-date-prototype-object
|
568
|
+
|
569
|
+
// 21.4.4.2 Date.prototype.getDate ()
|
570
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getdate
|
571
|
+
export const ___date_prototype_getDate = (_this: Date) => {
|
572
|
+
// 1. Let dateObject be the this value.
|
573
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
574
|
+
// 3. Let t be dateObject.[[DateValue]].
|
575
|
+
const t: number = __Porffor_date_read(_this);
|
576
|
+
|
577
|
+
// 4. If t is NaN, return NaN.
|
578
|
+
if (Number.isNaN(t)) return NaN;
|
579
|
+
|
580
|
+
// 5. Return DateFromTime(LocalTime(t)).
|
581
|
+
return __ecma262_DateFromTime(__ecma262_LocalTime(t));
|
582
|
+
};
|
583
|
+
|
584
|
+
// 21.4.4.3 Date.prototype.getDay ()
|
585
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getday
|
586
|
+
export const ___date_prototype_getDay = (_this: Date) => {
|
587
|
+
// 1. Let dateObject be the this value.
|
588
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
589
|
+
// 3. Let t be dateObject.[[DateValue]].
|
590
|
+
const t: number = __Porffor_date_read(_this);
|
591
|
+
|
592
|
+
// 4. If t is NaN, return NaN.
|
593
|
+
if (Number.isNaN(t)) return NaN;
|
594
|
+
|
595
|
+
// 5. Return WeekDay(LocalTime(t)).
|
596
|
+
return __ecma262_WeekDay(__ecma262_LocalTime(t));
|
597
|
+
};
|
598
|
+
|
599
|
+
// 21.4.4.4 Date.prototype.getFullYear ()
|
600
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getfullyear
|
601
|
+
export const ___date_prototype_getFullYear = (_this: Date) => {
|
602
|
+
// 1. Let dateObject be the this value.
|
603
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
604
|
+
// 3. Let t be dateObject.[[DateValue]].
|
605
|
+
const t: number = __Porffor_date_read(_this);
|
606
|
+
|
607
|
+
// 4. If t is NaN, return NaN.
|
608
|
+
if (Number.isNaN(t)) return NaN;
|
609
|
+
|
610
|
+
// 5. Return YearFromTime(LocalTime(t)).
|
611
|
+
return __ecma262_YearFromTime(__ecma262_LocalTime(t));
|
612
|
+
};
|
613
|
+
|
614
|
+
// 21.4.4.5 Date.prototype.getHours ()
|
615
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.gethours
|
616
|
+
export const ___date_prototype_getHours = (_this: Date) => {
|
617
|
+
// 1. Let dateObject be the this value.
|
618
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
619
|
+
// 3. Let t be dateObject.[[DateValue]].
|
620
|
+
const t: number = __Porffor_date_read(_this);
|
621
|
+
|
622
|
+
// 4. If t is NaN, return NaN.
|
623
|
+
if (Number.isNaN(t)) return NaN;
|
624
|
+
|
625
|
+
// 5. Return HourFromTime(LocalTime(t)).
|
626
|
+
return __ecma262_HourFromTime(__ecma262_LocalTime(t));
|
627
|
+
};
|
628
|
+
|
629
|
+
// 21.4.4.6 Date.prototype.getMilliseconds ()
|
630
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getmilliseconds
|
631
|
+
export const ___date_prototype_getMilliseconds = (_this: Date) => {
|
632
|
+
// 1. Let dateObject be the this value.
|
633
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
634
|
+
// 3. Let t be dateObject.[[DateValue]].
|
635
|
+
const t: number = __Porffor_date_read(_this);
|
636
|
+
|
637
|
+
// 4. If t is NaN, return NaN.
|
638
|
+
if (Number.isNaN(t)) return NaN;
|
639
|
+
|
640
|
+
// 5. Return msFromTime(LocalTime(t)).
|
641
|
+
return __ecma262_msFromTime(__ecma262_LocalTime(t));
|
642
|
+
};
|
643
|
+
|
644
|
+
// 21.4.4.7 Date.prototype.getMinutes ()
|
645
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getminutes
|
646
|
+
export const ___date_prototype_getMinutes = (_this: Date) => {
|
647
|
+
// 1. Let dateObject be the this value.
|
648
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
649
|
+
// 3. Let t be dateObject.[[DateValue]].
|
650
|
+
const t: number = __Porffor_date_read(_this);
|
651
|
+
|
652
|
+
// 4. If t is NaN, return NaN.
|
653
|
+
if (Number.isNaN(t)) return NaN;
|
654
|
+
|
655
|
+
// 5. Return MinFromTime(LocalTime(t)).
|
656
|
+
return __ecma262_MinFromTime(__ecma262_LocalTime(t));
|
657
|
+
};
|
658
|
+
|
659
|
+
// 21.4.4.8 Date.prototype.getMonth ()
|
660
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getmonth
|
661
|
+
export const ___date_prototype_getMonth = (_this: Date) => {
|
662
|
+
// 1. Let dateObject be the this value.
|
663
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
664
|
+
// 3. Let t be dateObject.[[DateValue]].
|
665
|
+
const t: number = __Porffor_date_read(_this);
|
666
|
+
|
667
|
+
// 4. If t is NaN, return NaN.
|
668
|
+
if (Number.isNaN(t)) return NaN;
|
669
|
+
|
670
|
+
// 5. Return MonthFromTime(LocalTime(t)).
|
671
|
+
return __ecma262_MonthFromTime(__ecma262_LocalTime(t));
|
672
|
+
};
|
673
|
+
|
674
|
+
// 21.4.4.9 Date.prototype.getSeconds ()
|
675
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getseconds
|
676
|
+
export const ___date_prototype_getSeconds = (_this: Date) => {
|
677
|
+
// 1. Let dateObject be the this value.
|
678
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
679
|
+
// 3. Let t be dateObject.[[DateValue]].
|
680
|
+
const t: number = __Porffor_date_read(_this);
|
681
|
+
|
682
|
+
// 4. If t is NaN, return NaN.
|
683
|
+
if (Number.isNaN(t)) return NaN;
|
684
|
+
|
685
|
+
// 5. Return SecFromTime(LocalTime(t)).
|
686
|
+
return __ecma262_SecFromTime(__ecma262_LocalTime(t));
|
687
|
+
};
|
688
|
+
|
689
|
+
// 21.4.4.10 Date.prototype.getTime ()
|
690
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.gettime
|
691
|
+
export const ___date_prototype_getTime = (_this: Date) => {
|
692
|
+
// 1. Let dateObject be the this value.
|
693
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
694
|
+
// 3. Return dateObject.[[DateValue]].
|
695
|
+
return __Porffor_date_read(_this);
|
696
|
+
};
|
697
|
+
|
698
|
+
// 21.4.4.11 Date.prototype.getTimezoneOffset ()
|
699
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.gettimezoneoffset
|
700
|
+
export const ___date_prototype_getTimezoneOffset = (_this: Date) => {
|
701
|
+
// 1. Let dateObject be the this value.
|
702
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
703
|
+
// 3. Let t be dateObject.[[DateValue]].
|
704
|
+
const t: number = __Porffor_date_read(_this);
|
705
|
+
|
706
|
+
// 4. If t is NaN, return NaN.
|
707
|
+
if (Number.isNaN(t)) return NaN;
|
708
|
+
|
709
|
+
// 5. Return (t - LocalTime(t)) / msPerMinute.
|
710
|
+
return (t - __ecma262_LocalTime(t)) / 60000;
|
711
|
+
};
|
712
|
+
|
713
|
+
// 21.4.4.12 Date.prototype.getUTCDate ()
|
714
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcdate
|
715
|
+
export const ___date_prototype_getUTCDate = (_this: Date) => {
|
716
|
+
// 1. Let dateObject be the this value.
|
717
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
718
|
+
// 3. Let t be dateObject.[[DateValue]].
|
719
|
+
const t: number = __Porffor_date_read(_this);
|
720
|
+
|
721
|
+
// 4. If t is NaN, return NaN.
|
722
|
+
if (Number.isNaN(t)) return NaN;
|
723
|
+
|
724
|
+
// 5. Return DateFromTime(t).
|
725
|
+
return __ecma262_DateFromTime(t);
|
726
|
+
};
|
727
|
+
|
728
|
+
// 21.4.4.13 Date.prototype.getUTCDay ()
|
729
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcday
|
730
|
+
export const ___date_prototype_getUTCDay = (_this: Date) => {
|
731
|
+
// 1. Let dateObject be the this value.
|
732
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
733
|
+
// 3. Let t be dateObject.[[DateValue]].
|
734
|
+
const t: number = __Porffor_date_read(_this);
|
735
|
+
|
736
|
+
// 4. If t is NaN, return NaN.
|
737
|
+
if (Number.isNaN(t)) return NaN;
|
738
|
+
|
739
|
+
// 5. Return WeekDay(t).
|
740
|
+
return __ecma262_WeekDay(t);
|
741
|
+
};
|
742
|
+
|
743
|
+
// 21.4.4.14 Date.prototype.getUTCFullYear ()
|
744
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcfullyear
|
745
|
+
export const ___date_prototype_getUTCFullYear = (_this: Date) => {
|
746
|
+
// 1. Let dateObject be the this value.
|
747
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
748
|
+
// 3. Let t be dateObject.[[DateValue]].
|
749
|
+
const t: number = __Porffor_date_read(_this);
|
750
|
+
|
751
|
+
// 4. If t is NaN, return NaN.
|
752
|
+
if (Number.isNaN(t)) return NaN;
|
753
|
+
|
754
|
+
// 5. Return YearFromTime(t).
|
755
|
+
return __ecma262_YearFromTime(t);
|
756
|
+
};
|
757
|
+
|
758
|
+
// 21.4.4.15 Date.prototype.getUTCHours ()
|
759
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutchours
|
760
|
+
export const ___date_prototype_getUTCHours = (_this: Date) => {
|
761
|
+
// 1. Let dateObject be the this value.
|
762
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
763
|
+
// 3. Let t be dateObject.[[DateValue]].
|
764
|
+
const t: number = __Porffor_date_read(_this);
|
765
|
+
|
766
|
+
// 4. If t is NaN, return NaN.
|
767
|
+
if (Number.isNaN(t)) return NaN;
|
768
|
+
|
769
|
+
// 5. Return HourFromTime(t).
|
770
|
+
return __ecma262_HourFromTime(t);
|
771
|
+
};
|
772
|
+
|
773
|
+
// 21.4.4.16 Date.prototype.getUTCMilliseconds ()
|
774
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcmilliseconds
|
775
|
+
export const ___date_prototype_getUTCMilliseconds = (_this: Date) => {
|
776
|
+
// 1. Let dateObject be the this value.
|
777
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
778
|
+
// 3. Let t be dateObject.[[DateValue]].
|
779
|
+
const t: number = __Porffor_date_read(_this);
|
780
|
+
|
781
|
+
// 4. If t is NaN, return NaN.
|
782
|
+
if (Number.isNaN(t)) return NaN;
|
783
|
+
|
784
|
+
// 5. Return msFromTime(t).
|
785
|
+
return __ecma262_msFromTime(t);
|
786
|
+
};
|
787
|
+
|
788
|
+
// 21.4.4.17 Date.prototype.getUTCMinutes ()
|
789
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcminutes
|
790
|
+
export const ___date_prototype_getUTCMinutes = (_this: Date) => {
|
791
|
+
// 1. Let dateObject be the this value.
|
792
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
793
|
+
// 3. Let t be dateObject.[[DateValue]].
|
794
|
+
const t: number = __Porffor_date_read(_this);
|
795
|
+
|
796
|
+
// 4. If t is NaN, return NaN.
|
797
|
+
if (Number.isNaN(t)) return NaN;
|
798
|
+
|
799
|
+
// 5. Return MinFromTime(t).
|
800
|
+
return __ecma262_MinFromTime(t);
|
801
|
+
};
|
802
|
+
|
803
|
+
// 21.4.4.18 Date.prototype.getUTCMonth ()
|
804
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcmonth
|
805
|
+
export const ___date_prototype_getUTCMonth = (_this: Date) => {
|
806
|
+
// 1. Let dateObject be the this value.
|
807
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
808
|
+
// 3. Let t be dateObject.[[DateValue]].
|
809
|
+
const t: number = __Porffor_date_read(_this);
|
810
|
+
|
811
|
+
// 4. If t is NaN, return NaN.
|
812
|
+
if (Number.isNaN(t)) return NaN;
|
813
|
+
|
814
|
+
// 5. Return MonthFromTime(t).
|
815
|
+
return __ecma262_MonthFromTime(t);
|
816
|
+
};
|
817
|
+
|
818
|
+
// 21.4.4.19 Date.prototype.getUTCSeconds ()
|
819
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.getutcseconds
|
820
|
+
export const ___date_prototype_getUTCSeconds = (_this: Date) => {
|
821
|
+
// 1. Let dateObject be the this value.
|
822
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
823
|
+
// 3. Let t be dateObject.[[DateValue]].
|
824
|
+
const t: number = __Porffor_date_read(_this);
|
825
|
+
|
826
|
+
// 4. If t is NaN, return NaN.
|
827
|
+
if (Number.isNaN(t)) return NaN;
|
828
|
+
|
829
|
+
// 5. Return SecFromTime(t).
|
830
|
+
return __ecma262_SecFromTime(t);
|
831
|
+
};
|
832
|
+
|
833
|
+
|
834
|
+
// 21.4.4.20 Date.prototype.setDate (date)
|
835
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setdate
|
836
|
+
export const ___date_prototype_setDate = (_this: Date, date: any) => {
|
837
|
+
// 1. Let dateObject be the this value.
|
838
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
839
|
+
// 3. Let t be dateObject.[[DateValue]].
|
840
|
+
let t: number = __Porffor_date_read(_this);
|
841
|
+
|
842
|
+
// 4. Let dt be ? ToNumber(date).
|
843
|
+
const dt: number = Number(date);
|
844
|
+
|
845
|
+
// 5. If t is NaN, return NaN.
|
846
|
+
if (Number.isNaN(t)) return NaN;
|
847
|
+
|
848
|
+
// 6. Set t to LocalTime(t).
|
849
|
+
t = __ecma262_LocalTime(t);
|
850
|
+
|
851
|
+
// 7. Let newDate be MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)).
|
852
|
+
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(__ecma262_YearFromTime(t), __ecma262_MonthFromTime(t), dt), __ecma262_TimeWithinDay(t));
|
853
|
+
|
854
|
+
// 8. Let u be TimeClip(UTC(newDate)).
|
855
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(newDate));
|
856
|
+
|
857
|
+
// 9. Set dateObject.[[DateValue]] to u.
|
858
|
+
__Porffor_date_write(_this, u);
|
859
|
+
|
860
|
+
// 10. Return u.
|
861
|
+
return u;
|
862
|
+
};
|
863
|
+
|
864
|
+
// 21.4.4.21 Date.prototype.setFullYear (year [, month [, date ]])
|
865
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setfullyear
|
866
|
+
export const ___date_prototype_setFullYear = (_this: Date, year: any, month: any, date: any) => {
|
867
|
+
// 1. Let dateObject be the this value.
|
868
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
869
|
+
// 3. Let t be dateObject.[[DateValue]].
|
870
|
+
let t: number = __Porffor_date_read(_this);
|
871
|
+
|
872
|
+
// 4. Let y be ? ToNumber(year).
|
873
|
+
const y: number = Number(year);
|
874
|
+
|
875
|
+
// 5. If t is NaN, set t to +0𝔽; otherwise, set t to LocalTime(t).
|
876
|
+
if (Number.isNaN(t)) t = 0;
|
877
|
+
else t = __ecma262_LocalTime(t);
|
878
|
+
|
879
|
+
// 6. If month is not present, let m be MonthFromTime(t); otherwise, let m be ? ToNumber(month).
|
880
|
+
let m: number;
|
881
|
+
if (Porffor.rawType(month) == Porffor.TYPES.undefined) m = __ecma262_MonthFromTime(t);
|
882
|
+
else m = Number(month);
|
883
|
+
|
884
|
+
// 7. If date is not present, let dt be DateFromTime(t); otherwise, let dt be ? ToNumber(date).
|
885
|
+
let dt: number;
|
886
|
+
if (Porffor.rawType(date) == Porffor.TYPES.undefined) dt = __ecma262_DateFromTime(t);
|
887
|
+
else dt = Number(date);
|
888
|
+
|
889
|
+
// 8. Let newDate be MakeDate(MakeDay(y, m, dt), TimeWithinDay(t)).
|
890
|
+
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(y, m, dt), __ecma262_TimeWithinDay(t));
|
891
|
+
|
892
|
+
// 9. Let u be TimeClip(UTC(newDate)).
|
893
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(newDate));
|
894
|
+
|
895
|
+
// 10. Set dateObject.[[DateValue]] to u.
|
896
|
+
__Porffor_date_write(_this, u);
|
897
|
+
|
898
|
+
// 11. Return u.
|
899
|
+
return u;
|
900
|
+
};
|
901
|
+
|
902
|
+
// 21.4.4.22 Date.prototype.setHours (hour [, min [, sec [, ms ]]])
|
903
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.sethours
|
904
|
+
export const ___date_prototype_setHours = (_this: Date, hour: any, min: any, sec: any, ms: any) => {
|
905
|
+
// 1. Let dateObject be the this value.
|
906
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
907
|
+
// 3. Let t be dateObject.[[DateValue]].
|
908
|
+
let t: number = __Porffor_date_read(_this);
|
909
|
+
|
910
|
+
// 4. Let h be ? ToNumber(hour).
|
911
|
+
const h: number = Number(hour);
|
912
|
+
|
913
|
+
// we reorder the spec steps in this func for easier arg handling
|
914
|
+
|
915
|
+
// 8. If t is NaN, return NaN.
|
916
|
+
if (Number.isNaN(t)) return NaN;
|
917
|
+
|
918
|
+
// 9. Set t to LocalTime(t).
|
919
|
+
t = __ecma262_LocalTime(t);
|
920
|
+
|
921
|
+
// 5. If min is present, let m be ? ToNumber(min).
|
922
|
+
let m: number;
|
923
|
+
if (Porffor.rawType(min) != Porffor.TYPES.undefined) m = Number(min);
|
924
|
+
// 10. If min is not present, let m be MinFromTime(t).
|
925
|
+
else m = __ecma262_MinFromTime(t);
|
926
|
+
|
927
|
+
// 6. If sec is present, let s be ? ToNumber(sec).
|
928
|
+
let s: number;
|
929
|
+
if (Porffor.rawType(sec) != Porffor.TYPES.undefined) s = Number(sec);
|
930
|
+
// 11. If sec is not present, let s be SecFromTime(t).
|
931
|
+
else s = __ecma262_SecFromTime(t);
|
932
|
+
|
933
|
+
// 7. If ms is present, let milli be ? ToNumber(ms).
|
934
|
+
let milli: number;
|
935
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) milli = Number(ms);
|
936
|
+
// 12. If ms is not present, let milli be msFromTime(t).
|
937
|
+
else milli = __ecma262_msFromTime(t);
|
938
|
+
|
939
|
+
// 13. Let date be MakeDate(Day(t), MakeTime(h, m, s, milli)).
|
940
|
+
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(h, m, s, milli));
|
941
|
+
|
942
|
+
// 14. Let u be TimeClip(UTC(date)).
|
943
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(date));
|
944
|
+
|
945
|
+
// 15. Set dateObject.[[DateValue]] to u.
|
946
|
+
__Porffor_date_write(_this, u);
|
947
|
+
|
948
|
+
// 16. Return u.
|
949
|
+
return u;
|
950
|
+
};
|
951
|
+
|
952
|
+
// 21.4.4.23 Date.prototype.setMilliseconds (ms)
|
953
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setmilliseconds
|
954
|
+
export const ___date_prototype_setMilliseconds = (_this: Date, ms: any) => {
|
955
|
+
// 1. Let dateObject be the this value.
|
956
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
957
|
+
// 3. Let t be dateObject.[[DateValue]].
|
958
|
+
let t: number = __Porffor_date_read(_this);
|
959
|
+
|
960
|
+
// ignore old-style spec setting arg instead of having let
|
961
|
+
// 4. Set ms to ? ToNumber(ms).
|
962
|
+
const milli: number = Number(ms);
|
963
|
+
|
964
|
+
// 5. If t is NaN, return NaN.
|
965
|
+
if (Number.isNaN(t)) return NaN;
|
966
|
+
|
967
|
+
// 6. Set t to LocalTime(t).
|
968
|
+
t = __ecma262_LocalTime(t);
|
969
|
+
|
970
|
+
// 7. Let time be MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms).
|
971
|
+
const time: number = __ecma262_MakeTime(__ecma262_HourFromTime(t), __ecma262_MinFromTime(t), __ecma262_SecFromTime(t), milli);
|
972
|
+
|
973
|
+
// 8. Let u be TimeClip(UTC(MakeDate(Day(t), time))).
|
974
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(__ecma262_MakeDate(__ecma262_Day(t), time)));
|
975
|
+
|
976
|
+
// 9. Set dateObject.[[DateValue]] to u.
|
977
|
+
__Porffor_date_write(_this, u);
|
978
|
+
|
979
|
+
// 10. Return u.
|
980
|
+
return u;
|
981
|
+
};
|
982
|
+
|
983
|
+
// 21.4.4.24 Date.prototype.setMinutes (min [, sec [, ms ]])
|
984
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setminutes
|
985
|
+
export const ___date_prototype_setMinutes = (_this: Date, min: any, sec: any, ms: any) => {
|
986
|
+
// 1. Let dateObject be the this value.
|
987
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
988
|
+
// 3. Let t be dateObject.[[DateValue]].
|
989
|
+
let t: number = __Porffor_date_read(_this);
|
990
|
+
|
991
|
+
// 4. Let m be ? ToNumber(min).
|
992
|
+
const m: number = Number(min);
|
993
|
+
|
994
|
+
// we reorder the spec steps in this func for easier arg handling
|
995
|
+
|
996
|
+
// 7. If t is NaN, return NaN.
|
997
|
+
if (Number.isNaN(t)) return NaN;
|
998
|
+
|
999
|
+
// 8. Set t to LocalTime(t).
|
1000
|
+
t = __ecma262_LocalTime(t);
|
1001
|
+
|
1002
|
+
// 5. If sec is present, let s be ? ToNumber(sec).
|
1003
|
+
let s: number;
|
1004
|
+
if (Porffor.rawType(sec) != Porffor.TYPES.undefined) s = Number(sec);
|
1005
|
+
// 9. If sec is not present, let s be SecFromTime(t).
|
1006
|
+
else s = __ecma262_SecFromTime(t);
|
1007
|
+
|
1008
|
+
// 6. If ms is present, let milli be ? ToNumber(ms).
|
1009
|
+
let milli: number;
|
1010
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) milli = Number(ms);
|
1011
|
+
// 10. If ms is not present, let milli be msFromTime(t).
|
1012
|
+
else milli = __ecma262_msFromTime(t);
|
1013
|
+
|
1014
|
+
// 11. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)).
|
1015
|
+
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), m, s, milli));
|
1016
|
+
|
1017
|
+
// 12. Let u be TimeClip(UTC(date)).
|
1018
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(date));
|
1019
|
+
|
1020
|
+
// 13. Set dateObject.[[DateValue]] to u.
|
1021
|
+
__Porffor_date_write(_this, u);
|
1022
|
+
|
1023
|
+
// 14. Return u.
|
1024
|
+
return u;
|
1025
|
+
};
|
1026
|
+
|
1027
|
+
// 21.4.4.25 Date.prototype.setMonth (month [, date ])
|
1028
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setmonth
|
1029
|
+
export const ___date_prototype_setMonth = (_this: Date, month: any, date: any) => {
|
1030
|
+
// 1. Let dateObject be the this value.
|
1031
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1032
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1033
|
+
let t: number = __Porffor_date_read(_this);
|
1034
|
+
|
1035
|
+
// 4. Let m be ? ToNumber(month).
|
1036
|
+
const m: number = Number(month);
|
1037
|
+
|
1038
|
+
// we reorder the spec steps in this func for easier arg handling
|
1039
|
+
|
1040
|
+
// 6. If t is NaN, return NaN.
|
1041
|
+
if (Number.isNaN(t)) return NaN;
|
1042
|
+
|
1043
|
+
// 7. Set t to LocalTime(t).
|
1044
|
+
t = __ecma262_LocalTime(t);
|
1045
|
+
|
1046
|
+
// 5. If date is present, let dt be ? ToNumber(date).
|
1047
|
+
let dt: number;
|
1048
|
+
if (Porffor.rawType(date) != Porffor.TYPES.undefined) dt = Number(date);
|
1049
|
+
// 8. If date is not present, let dt be DateFromTime(t).
|
1050
|
+
else dt = __ecma262_DateFromTime(t);
|
1051
|
+
|
1052
|
+
// 9. Let newDate be MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).
|
1053
|
+
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(__ecma262_YearFromTime(t), m, dt), __ecma262_TimeWithinDay(t));
|
1054
|
+
|
1055
|
+
// 10. Let u be TimeClip(UTC(newDate)).
|
1056
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(newDate));
|
1057
|
+
|
1058
|
+
// 11. Set dateObject.[[DateValue]] to u.
|
1059
|
+
__Porffor_date_write(_this, u);
|
1060
|
+
|
1061
|
+
// 12. Return u.
|
1062
|
+
return u;
|
1063
|
+
};
|
1064
|
+
|
1065
|
+
// 21.4.4.26 Date.prototype.setSeconds (sec [, ms ])
|
1066
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setseconds
|
1067
|
+
export const ___date_prototype_setSeconds = (_this: Date, sec: any, ms: any) => {
|
1068
|
+
// 1. Let dateObject be the this value.
|
1069
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1070
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1071
|
+
let t: number = __Porffor_date_read(_this);
|
1072
|
+
|
1073
|
+
// 4. Let s be ? ToNumber(sec).
|
1074
|
+
const s: number = Number(sec);
|
1075
|
+
|
1076
|
+
// we reorder the spec steps in this func for easier arg handling
|
1077
|
+
|
1078
|
+
// 6. If t is NaN, return NaN.
|
1079
|
+
if (Number.isNaN(t)) return NaN;
|
1080
|
+
|
1081
|
+
// 7. Set t to LocalTime(t).
|
1082
|
+
t = __ecma262_LocalTime(t);
|
1083
|
+
|
1084
|
+
// 5. If ms is present, let milli be ? ToNumber(ms).
|
1085
|
+
let milli: number;
|
1086
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) milli = Number(ms);
|
1087
|
+
// 8. If ms is not present, let milli be msFromTime(t).
|
1088
|
+
else milli = __ecma262_msFromTime(t);
|
1089
|
+
|
1090
|
+
// 9. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)).
|
1091
|
+
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), __ecma262_MinFromTime(t), s, milli));
|
1092
|
+
|
1093
|
+
// 10. Let u be TimeClip(UTC(date)).
|
1094
|
+
const u: number = __ecma262_TimeClip(__ecma262_UTC(date));
|
1095
|
+
|
1096
|
+
// 11. Set dateObject.[[DateValue]] to u.
|
1097
|
+
__Porffor_date_write(_this, u);
|
1098
|
+
|
1099
|
+
// 12. Return u.
|
1100
|
+
return u;
|
1101
|
+
};
|
1102
|
+
|
1103
|
+
|
1104
|
+
// 21.4.4.27 Date.prototype.setTime (time)
|
1105
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.settime
|
1106
|
+
export const ___date_prototype_setTime = (_this: Date, time: any) => {
|
1107
|
+
// 1. Let dateObject be the this value.
|
1108
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1109
|
+
// 3. Let t be ? ToNumber(time).
|
1110
|
+
const t: number = Number(time);
|
1111
|
+
|
1112
|
+
// 4. Let v be TimeClip(t).
|
1113
|
+
const v: number = __ecma262_TimeClip(t);
|
1114
|
+
|
1115
|
+
// 5. Set dateObject.[[DateValue]] to v
|
1116
|
+
__Porffor_date_write(_this, v);
|
1117
|
+
|
1118
|
+
// 6. Return v.
|
1119
|
+
return v;
|
1120
|
+
};
|
1121
|
+
|
1122
|
+
// 21.4.4.28 Date.prototype.setUTCDate (date)
|
1123
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutcdate
|
1124
|
+
export const ___date_prototype_setUTCDate = (_this: Date, date: any) => {
|
1125
|
+
// 1. Let dateObject be the this value.
|
1126
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1127
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1128
|
+
const t: number = __Porffor_date_read(_this);
|
1129
|
+
|
1130
|
+
// 4. Let dt be ? ToNumber(date).
|
1131
|
+
const dt: number = Number(date);
|
1132
|
+
|
1133
|
+
// 5. If t is NaN, return NaN.
|
1134
|
+
if (Number.isNaN(t)) return NaN;
|
1135
|
+
|
1136
|
+
// 6. Let newDate be MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)).
|
1137
|
+
const newDate = __ecma262_MakeDate(__ecma262_MakeDay(__ecma262_YearFromTime(t), __ecma262_MonthFromTime(t), dt), __ecma262_TimeWithinDay(t));
|
1138
|
+
|
1139
|
+
// 7. Let v be TimeClip(newDate).
|
1140
|
+
const v: number = __ecma262_TimeClip(newDate);
|
1141
|
+
|
1142
|
+
// 8. Set dateObject.[[DateValue]] to v.
|
1143
|
+
__Porffor_date_write(_this, v);
|
1144
|
+
|
1145
|
+
// 9. Return v.
|
1146
|
+
return v;
|
1147
|
+
};
|
1148
|
+
|
1149
|
+
// 21.4.4.29 Date.prototype.setUTCFullYear (year [, month [, date ]])
|
1150
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutcfullyear
|
1151
|
+
export const ___date_prototype_setUTCFullYear = (_this: Date, year: any, month: any, date: any) => {
|
1152
|
+
// 1. Let dateObject be the this value.
|
1153
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1154
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1155
|
+
let t: number = __Porffor_date_read(_this);
|
1156
|
+
|
1157
|
+
// 4. If t is NaN, set t to +0𝔽.
|
1158
|
+
if (Number.isNaN(t)) t = 0;
|
1159
|
+
|
1160
|
+
// 5. Let y be ? ToNumber(year).
|
1161
|
+
const y: number = Number(year);
|
1162
|
+
|
1163
|
+
// 6. If month is not present, let m be MonthFromTime(t); otherwise, let m be ? ToNumber(month).
|
1164
|
+
let m: number;
|
1165
|
+
if (Porffor.rawType(month) == Porffor.TYPES.undefined) m = __ecma262_MonthFromTime(t);
|
1166
|
+
else m = Number(month);
|
1167
|
+
|
1168
|
+
// 7. If date is not present, let dt be DateFromTime(t); otherwise, let dt be ? ToNumber(date).
|
1169
|
+
let dt: number;
|
1170
|
+
if (Porffor.rawType(date) == Porffor.TYPES.undefined) dt = __ecma262_DateFromTime(t);
|
1171
|
+
else dt = Number(date);
|
1172
|
+
|
1173
|
+
// 8. Let newDate be MakeDate(MakeDay(y, m, dt), TimeWithinDay(t)).
|
1174
|
+
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(y, m, dt), __ecma262_TimeWithinDay(t));
|
1175
|
+
|
1176
|
+
// 9. Let v be TimeClip(newDate).
|
1177
|
+
const v: number = __ecma262_TimeClip(newDate);
|
1178
|
+
|
1179
|
+
// 10. Set dateObject.[[DateValue]] to v.
|
1180
|
+
__Porffor_date_write(_this, v);
|
1181
|
+
|
1182
|
+
// 11. Return v.
|
1183
|
+
return v;
|
1184
|
+
};
|
1185
|
+
|
1186
|
+
// 21.4.4.30 Date.prototype.setUTCHours (hour [, min [, sec [, ms ]]])
|
1187
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutchours
|
1188
|
+
export const ___date_prototype_setUTCHours = (_this: Date, hour: any, min: any, sec: any, ms: any) => {
|
1189
|
+
// 1. Let dateObject be the this value.
|
1190
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1191
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1192
|
+
let t: number = __Porffor_date_read(_this);
|
1193
|
+
|
1194
|
+
// 4. Let h be ? ToNumber(hour).
|
1195
|
+
const h: number = Number(hour);
|
1196
|
+
|
1197
|
+
// we reorder the spec steps in this func for easier arg handling
|
1198
|
+
|
1199
|
+
// 8. If t is NaN, return NaN.
|
1200
|
+
if (Number.isNaN(t)) return NaN;
|
1201
|
+
|
1202
|
+
// 5. If min is present, let m be ? ToNumber(min).
|
1203
|
+
let m: number;
|
1204
|
+
if (Porffor.rawType(min) != Porffor.TYPES.undefined) m = Number(min);
|
1205
|
+
// 9. If min is not present, let m be MinFromTime(t).
|
1206
|
+
else m = __ecma262_MinFromTime(t);
|
1207
|
+
|
1208
|
+
// 6. If sec is present, let s be ? ToNumber(sec).
|
1209
|
+
let s: number;
|
1210
|
+
if (Porffor.rawType(sec) != Porffor.TYPES.undefined) s = Number(sec);
|
1211
|
+
// 10. If sec is not present, let s be SecFromTime(t).
|
1212
|
+
else s = __ecma262_SecFromTime(t);
|
1213
|
+
|
1214
|
+
// 7. If ms is present, let milli be ? ToNumber(ms).
|
1215
|
+
let milli: number;
|
1216
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) milli = Number(ms);
|
1217
|
+
// 11. If ms is not present, let milli be msFromTime(t).
|
1218
|
+
else milli = __ecma262_msFromTime(t);
|
1219
|
+
|
1220
|
+
// 12. Let date be MakeDate(Day(t), MakeTime(h, m, s, milli)).
|
1221
|
+
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(h, m, s, milli));
|
1222
|
+
|
1223
|
+
// 13. Let v be TimeClip(date).
|
1224
|
+
const v: number = __ecma262_TimeClip(date);
|
1225
|
+
|
1226
|
+
// 14. Set dateObject.[[DateValue]] to v.
|
1227
|
+
__Porffor_date_write(_this, v);
|
1228
|
+
|
1229
|
+
// 15. Return v.
|
1230
|
+
return v;
|
1231
|
+
};
|
1232
|
+
|
1233
|
+
// 21.4.4.31 Date.prototype.setUTCMilliseconds (ms)
|
1234
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutcmilliseconds
|
1235
|
+
export const ___date_prototype_setUTCMilliseconds = (_this: Date, ms: any) => {
|
1236
|
+
// 1. Let dateObject be the this value.
|
1237
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1238
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1239
|
+
let t: number = __Porffor_date_read(_this);
|
1240
|
+
|
1241
|
+
// ignore old-style spec setting arg instead of having let
|
1242
|
+
// 4. Set ms to ? ToNumber(ms).
|
1243
|
+
const milli: number = Number(ms);
|
1244
|
+
|
1245
|
+
// 5. If t is NaN, return NaN.
|
1246
|
+
if (Number.isNaN(t)) return NaN;
|
1247
|
+
|
1248
|
+
// 6. Let time be MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms).
|
1249
|
+
const time: number = __ecma262_MakeTime(__ecma262_HourFromTime(t), __ecma262_MinFromTime(t), __ecma262_SecFromTime(t), milli);
|
1250
|
+
|
1251
|
+
// 7. Let v be TimeClip(MakeDate(Day(t), time)).
|
1252
|
+
const v: number = __ecma262_TimeClip(__ecma262_MakeDate(__ecma262_Day(t), time));
|
1253
|
+
|
1254
|
+
// 8. Set dateObject.[[DateValue]] to v.
|
1255
|
+
__Porffor_date_write(_this, v);
|
1256
|
+
|
1257
|
+
// 10. Return v.
|
1258
|
+
return v;
|
1259
|
+
};
|
1260
|
+
|
1261
|
+
// 21.4.4.32 Date.prototype.setUTCMinutes (min [, sec [, ms ]])
|
1262
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutcminutes
|
1263
|
+
export const ___date_prototype_setUTCMinutes = (_this: Date, min: any, sec: any, ms: any) => {
|
1264
|
+
// 1. Let dateObject be the this value.
|
1265
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1266
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1267
|
+
let t: number = __Porffor_date_read(_this);
|
1268
|
+
|
1269
|
+
// 4. Let m be ? ToNumber(min).
|
1270
|
+
const m: number = Number(min);
|
1271
|
+
|
1272
|
+
// we reorder the spec steps in this func for easier arg handling
|
1273
|
+
|
1274
|
+
// 7. If t is NaN, return NaN.
|
1275
|
+
if (Number.isNaN(t)) return NaN;
|
1276
|
+
|
1277
|
+
// 5. If sec is present, let s be ? ToNumber(sec).
|
1278
|
+
let s: number;
|
1279
|
+
if (Porffor.rawType(sec) != Porffor.TYPES.undefined) s = Number(sec);
|
1280
|
+
// 8. If sec is not present, let s be SecFromTime(t).
|
1281
|
+
else s = __ecma262_SecFromTime(t);
|
1282
|
+
|
1283
|
+
// 6. If ms is present, let milli be ? ToNumber(ms).
|
1284
|
+
let milli: number;
|
1285
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) milli = Number(ms);
|
1286
|
+
// 9. If ms is not present, let milli be msFromTime(t).
|
1287
|
+
else milli = __ecma262_msFromTime(t);
|
1288
|
+
|
1289
|
+
// 10. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)).
|
1290
|
+
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), m, s, milli));
|
1291
|
+
|
1292
|
+
// 11. Let v be TimeClip(date).
|
1293
|
+
const v: number = __ecma262_TimeClip(date);
|
1294
|
+
|
1295
|
+
// 12. Set dateObject.[[DateValue]] to v.
|
1296
|
+
__Porffor_date_write(_this, v);
|
1297
|
+
|
1298
|
+
// 13. Return v.
|
1299
|
+
return v;
|
1300
|
+
};
|
1301
|
+
|
1302
|
+
// 21.4.4.33 Date.prototype.setUTCMonth (month [, date ])
|
1303
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutcmonth
|
1304
|
+
export const ___date_prototype_setUTCMonth = (_this: Date, month: any, date: any) => {
|
1305
|
+
// 1. Let dateObject be the this value.
|
1306
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1307
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1308
|
+
let t: number = __Porffor_date_read(_this);
|
1309
|
+
|
1310
|
+
// 4. Let m be ? ToNumber(month).
|
1311
|
+
const m: number = Number(month);
|
1312
|
+
|
1313
|
+
// we reorder the spec steps in this func for easier arg handling
|
1314
|
+
|
1315
|
+
// 6. If t is NaN, return NaN.
|
1316
|
+
if (Number.isNaN(t)) return NaN;
|
1317
|
+
|
1318
|
+
// 5. If date is present, let dt be ? ToNumber(date).
|
1319
|
+
let dt: number;
|
1320
|
+
if (Porffor.rawType(date) != Porffor.TYPES.undefined) dt = Number(date);
|
1321
|
+
// 7. If date is not present, let dt be DateFromTime(t).
|
1322
|
+
else dt = __ecma262_DateFromTime(t);
|
1323
|
+
|
1324
|
+
// 8. Let newDate be MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).
|
1325
|
+
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(__ecma262_YearFromTime(t), m, dt), __ecma262_TimeWithinDay(t));
|
1326
|
+
|
1327
|
+
// 9. Let v be TimeClip(newDate).
|
1328
|
+
const v: number = __ecma262_TimeClip(newDate);
|
1329
|
+
|
1330
|
+
// 10. Set dateObject.[[DateValue]] to v.
|
1331
|
+
__Porffor_date_write(_this, v);
|
1332
|
+
|
1333
|
+
// 11. Return v.
|
1334
|
+
return v;
|
1335
|
+
};
|
1336
|
+
|
1337
|
+
// 21.4.4.34 Date.prototype.setUTCSeconds (sec [, ms ])
|
1338
|
+
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.setutcseconds
|
1339
|
+
export const ___date_prototype_setUTCSeconds = (_this: Date, sec: any, ms: any) => {
|
1340
|
+
// 1. Let dateObject be the this value.
|
1341
|
+
// 2. Perform ? RequireInternalSlot(dateObject, [[DateValue]]).
|
1342
|
+
// 3. Let t be dateObject.[[DateValue]].
|
1343
|
+
let t: number = __Porffor_date_read(_this);
|
1344
|
+
|
1345
|
+
// 4. Let s be ? ToNumber(sec).
|
1346
|
+
const s: number = Number(sec);
|
1347
|
+
|
1348
|
+
// we reorder the spec steps in this func for easier arg handling
|
1349
|
+
|
1350
|
+
// 6. If t is NaN, return NaN.
|
1351
|
+
if (Number.isNaN(t)) return NaN;
|
1352
|
+
|
1353
|
+
// 5. If ms is present, let milli be ? ToNumber(ms).
|
1354
|
+
let milli: number;
|
1355
|
+
if (Porffor.rawType(ms) != Porffor.TYPES.undefined) milli = Number(ms);
|
1356
|
+
// 7. If ms is not present, let milli be msFromTime(t).
|
1357
|
+
else milli = __ecma262_msFromTime(t);
|
1358
|
+
|
1359
|
+
// 8. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)).
|
1360
|
+
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), __ecma262_MinFromTime(t), s, milli));
|
1361
|
+
|
1362
|
+
// 9. Let v be TimeClip(date).
|
1363
|
+
const v: number = __ecma262_TimeClip(date);
|
1364
|
+
|
1365
|
+
// 10. Set dateObject.[[DateValue]] to v.
|
1366
|
+
__Porffor_date_write(_this, v);
|
1367
|
+
|
1368
|
+
// 11. Return v.
|
1369
|
+
return v;
|
1370
|
+
};
|