porffor 0.60.13 → 0.60.15
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/compiler/builtins/date.ts +33 -44
- package/compiler/builtins/object.ts +15 -16
- package/compiler/builtins_precompiled.js +460 -455
- package/compiler/codegen.js +7 -5
- package/foo.js +26 -1
- package/package.json +1 -1
- package/runtime/index.js +1 -1
@@ -1,5 +1,7 @@
|
|
1
1
|
import type {} from './porffor.d.ts';
|
2
2
|
|
3
|
+
export const __ecma262_Modulo = (x: number, y: number): number => x - Math.floor(x / y) * y;
|
4
|
+
|
3
5
|
// 21.4.1.3 Day (t)
|
4
6
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-day
|
5
7
|
// 1. Return 𝔽(floor(ℝ(t / msPerDay))).
|
@@ -8,20 +10,20 @@ export const __ecma262_Day = (t: number): number => Math.floor(t / 86400000);
|
|
8
10
|
// 21.4.1.4 TimeWithinDay (t)
|
9
11
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-day
|
10
12
|
// 1. Return 𝔽(ℝ(t) modulo ℝ(msPerDay)).
|
11
|
-
export const __ecma262_TimeWithinDay = (t: number): number => t
|
13
|
+
export const __ecma262_TimeWithinDay = (t: number): number => __ecma262_Modulo(t, 86400000);
|
12
14
|
|
13
15
|
// 21.4.1.5 DaysInYear (y)
|
14
16
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-daysinyear
|
15
17
|
export const __ecma262_DaysInYear = (y: number): number => {
|
16
18
|
// 1. Let ry be ℝ(y).
|
17
19
|
// 2. If (ry modulo 400) = 0, return 366𝔽.
|
18
|
-
if (y
|
20
|
+
if (__ecma262_Modulo(y, 400) == 0) return 366;
|
19
21
|
|
20
22
|
// 3. If (ry modulo 100) = 0, return 365𝔽.
|
21
|
-
if (y
|
23
|
+
if (__ecma262_Modulo(y, 100) == 0) return 365;
|
22
24
|
|
23
25
|
// 4. If (ry modulo 4) = 0, return 366𝔽.
|
24
|
-
if (y
|
26
|
+
if (__ecma262_Modulo(y, 4) == 0) return 366;
|
25
27
|
|
26
28
|
// 5. Return 365𝔽.
|
27
29
|
return 365;
|
@@ -158,27 +160,27 @@ export const __ecma262_DateFromTime = (t: number): number => {
|
|
158
160
|
// 21.4.1.13 WeekDay (t)
|
159
161
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-weekday
|
160
162
|
// 1. Return 𝔽(ℝ(Day(t) + 4𝔽) modulo 7).
|
161
|
-
export const __ecma262_WeekDay = (t: number): number => (__ecma262_Day(t) + 4
|
163
|
+
export const __ecma262_WeekDay = (t: number): number => __ecma262_Modulo(__ecma262_Day(t) + 4, 7);
|
162
164
|
|
163
165
|
// 21.4.1.14 HourFromTime (t)
|
164
166
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-hourfromtime
|
165
167
|
// 1. Return 𝔽(floor(ℝ(t / msPerHour)) modulo HoursPerDay).
|
166
|
-
export const __ecma262_HourFromTime = (t: number): number => Math.floor(t / 3600000)
|
168
|
+
export const __ecma262_HourFromTime = (t: number): number => __ecma262_Modulo(Math.floor(t / 3600000), 24);
|
167
169
|
|
168
170
|
// 21.4.1.15 MinFromTime (t)
|
169
171
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-minfromtime
|
170
172
|
// 1. Return 𝔽(floor(ℝ(t / msPerMinute)) modulo MinutesPerHour).
|
171
|
-
export const __ecma262_MinFromTime = (t: number): number => Math.floor(t / 60000)
|
173
|
+
export const __ecma262_MinFromTime = (t: number): number => __ecma262_Modulo(Math.floor(t / 60000), 60);
|
172
174
|
|
173
175
|
// 21.4.1.16 SecFromTime (t)
|
174
176
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-secfromtime
|
175
177
|
// 1. Return 𝔽(floor(ℝ(t / msPerSecond)) modulo SecondsPerMinute).
|
176
|
-
export const __ecma262_SecFromTime = (t: number): number => Math.floor(t / 1000)
|
178
|
+
export const __ecma262_SecFromTime = (t: number): number => __ecma262_Modulo(Math.floor(t / 1000), 60);
|
177
179
|
|
178
180
|
// 21.4.1.17 msFromTime (t)
|
179
181
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-msfromtime
|
180
182
|
// 1. Return 𝔽(ℝ(t) modulo ℝ(msPerSecond)).
|
181
|
-
export const __ecma262_msFromTime = (t: number): number => t
|
183
|
+
export const __ecma262_msFromTime = (t: number): number => __ecma262_Modulo(t, 1000);
|
182
184
|
|
183
185
|
// 21.4.1.25 LocalTime (t)
|
184
186
|
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-localtime
|
@@ -229,7 +231,7 @@ export const __ecma262_MakeDay = (year: number, month: number, date: number): nu
|
|
229
231
|
if (!Number.isFinite(ym)) return NaN;
|
230
232
|
|
231
233
|
// 7. Let mn be 𝔽(ℝ(m) modulo 12).
|
232
|
-
const mn: number = m
|
234
|
+
const mn: number = __ecma262_Modulo(m, 12);
|
233
235
|
|
234
236
|
// 8. Find a finite time value t such that YearFromTime(t) is ym, MonthFromTime(t) is mn, and DateFromTime(t) is 1𝔽;
|
235
237
|
// but if this is not possible (because some argument is out of range), return NaN.
|
@@ -946,11 +948,6 @@ export const __Date_prototype_setHours = (_this: any, hour: any, min: any, sec:
|
|
946
948
|
// 4. Let h be ? ToNumber(hour).
|
947
949
|
const h: number = ecma262.ToNumber(hour);
|
948
950
|
|
949
|
-
// we reorder the spec steps in this func for easier arg handling
|
950
|
-
|
951
|
-
// 8. If t is NaN, return NaN.
|
952
|
-
if (Number.isNaN(t)) return NaN;
|
953
|
-
|
954
951
|
// 9. Set t to LocalTime(t).
|
955
952
|
t = __ecma262_LocalTime(t);
|
956
953
|
|
@@ -972,6 +969,9 @@ export const __Date_prototype_setHours = (_this: any, hour: any, min: any, sec:
|
|
972
969
|
// 12. If ms is not present, let milli be msFromTime(t).
|
973
970
|
else milli = __ecma262_msFromTime(t);
|
974
971
|
|
972
|
+
// 8. If t is NaN, return NaN.
|
973
|
+
if (Number.isNaN(t)) return NaN;
|
974
|
+
|
975
975
|
// 13. Let date be MakeDate(Day(t), MakeTime(h, m, s, milli)).
|
976
976
|
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(h, m, s, milli));
|
977
977
|
|
@@ -1027,11 +1027,6 @@ export const __Date_prototype_setMinutes = (_this: any, min: any, sec: any, ms:
|
|
1027
1027
|
// 4. Let m be ? ToNumber(min).
|
1028
1028
|
const m: number = ecma262.ToNumber(min);
|
1029
1029
|
|
1030
|
-
// we reorder the spec steps in this func for easier arg handling
|
1031
|
-
|
1032
|
-
// 7. If t is NaN, return NaN.
|
1033
|
-
if (Number.isNaN(t)) return NaN;
|
1034
|
-
|
1035
1030
|
// 8. Set t to LocalTime(t).
|
1036
1031
|
t = __ecma262_LocalTime(t);
|
1037
1032
|
|
@@ -1047,6 +1042,9 @@ export const __Date_prototype_setMinutes = (_this: any, min: any, sec: any, ms:
|
|
1047
1042
|
// 10. If ms is not present, let milli be msFromTime(t).
|
1048
1043
|
else milli = __ecma262_msFromTime(t);
|
1049
1044
|
|
1045
|
+
// 7. If t is NaN, return NaN.
|
1046
|
+
if (Number.isNaN(t)) return NaN;
|
1047
|
+
|
1050
1048
|
// 11. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)).
|
1051
1049
|
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), m, s, milli));
|
1052
1050
|
|
@@ -1071,11 +1069,6 @@ export const __Date_prototype_setMonth = (_this: any, month: any, date: any) =>
|
|
1071
1069
|
// 4. Let m be ? ToNumber(month).
|
1072
1070
|
const m: number = ecma262.ToNumber(month);
|
1073
1071
|
|
1074
|
-
// we reorder the spec steps in this func for easier arg handling
|
1075
|
-
|
1076
|
-
// 6. If t is NaN, return NaN.
|
1077
|
-
if (Number.isNaN(t)) return NaN;
|
1078
|
-
|
1079
1072
|
// 7. Set t to LocalTime(t).
|
1080
1073
|
t = __ecma262_LocalTime(t);
|
1081
1074
|
|
@@ -1085,6 +1078,9 @@ export const __Date_prototype_setMonth = (_this: any, month: any, date: any) =>
|
|
1085
1078
|
// 8. If date is not present, let dt be DateFromTime(t).
|
1086
1079
|
else dt = __ecma262_DateFromTime(t);
|
1087
1080
|
|
1081
|
+
// 6. If t is NaN, return NaN.
|
1082
|
+
if (Number.isNaN(t)) return NaN;
|
1083
|
+
|
1088
1084
|
// 9. Let newDate be MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).
|
1089
1085
|
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(__ecma262_YearFromTime(t), m, dt), __ecma262_TimeWithinDay(t));
|
1090
1086
|
|
@@ -1109,10 +1105,6 @@ export const __Date_prototype_setSeconds = (_this: any, sec: any, ms: any) => {
|
|
1109
1105
|
// 4. Let s be ? ToNumber(sec).
|
1110
1106
|
const s: number = ecma262.ToNumber(sec);
|
1111
1107
|
|
1112
|
-
// we reorder the spec steps in this func for easier arg handling
|
1113
|
-
// 6. If t is NaN, return NaN.
|
1114
|
-
if (Number.isNaN(t)) return NaN;
|
1115
|
-
|
1116
1108
|
// 7. Set t to LocalTime(t).
|
1117
1109
|
t = __ecma262_LocalTime(t);
|
1118
1110
|
|
@@ -1122,6 +1114,9 @@ export const __Date_prototype_setSeconds = (_this: any, sec: any, ms: any) => {
|
|
1122
1114
|
// 8. If ms is not present, let milli be msFromTime(t).
|
1123
1115
|
else milli = __ecma262_msFromTime(t);
|
1124
1116
|
|
1117
|
+
// 6. If t is NaN, return NaN.
|
1118
|
+
if (Number.isNaN(t)) return NaN;
|
1119
|
+
|
1125
1120
|
// 9. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)).
|
1126
1121
|
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), __ecma262_MinFromTime(t), s, milli));
|
1127
1122
|
|
@@ -1232,11 +1227,6 @@ export const __Date_prototype_setUTCHours = (_this: any, hour: any, min: any, se
|
|
1232
1227
|
// 4. Let h be ? ToNumber(hour).
|
1233
1228
|
const h: number = ecma262.ToNumber(hour);
|
1234
1229
|
|
1235
|
-
// we reorder the spec steps in this func for easier arg handling
|
1236
|
-
|
1237
|
-
// 8. If t is NaN, return NaN.
|
1238
|
-
if (Number.isNaN(t)) return NaN;
|
1239
|
-
|
1240
1230
|
// 5. If min is present, let m be ? ToNumber(min).
|
1241
1231
|
let m: number;
|
1242
1232
|
if (Porffor.type(min) != Porffor.TYPES.undefined) m = ecma262.ToNumber(min);
|
@@ -1255,6 +1245,9 @@ export const __Date_prototype_setUTCHours = (_this: any, hour: any, min: any, se
|
|
1255
1245
|
// 11. If ms is not present, let milli be msFromTime(t).
|
1256
1246
|
else milli = __ecma262_msFromTime(t);
|
1257
1247
|
|
1248
|
+
// 8. If t is NaN, return NaN.
|
1249
|
+
if (Number.isNaN(t)) return NaN;
|
1250
|
+
|
1258
1251
|
// 12. Let date be MakeDate(Day(t), MakeTime(h, m, s, milli)).
|
1259
1252
|
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(h, m, s, milli));
|
1260
1253
|
|
@@ -1307,11 +1300,6 @@ export const __Date_prototype_setUTCMinutes = (_this: any, min: any, sec: any, m
|
|
1307
1300
|
// 4. Let m be ? ToNumber(min).
|
1308
1301
|
const m: number = ecma262.ToNumber(min);
|
1309
1302
|
|
1310
|
-
// we reorder the spec steps in this func for easier arg handling
|
1311
|
-
|
1312
|
-
// 7. If t is NaN, return NaN.
|
1313
|
-
if (Number.isNaN(t)) return NaN;
|
1314
|
-
|
1315
1303
|
// 5. If sec is present, let s be ? ToNumber(sec).
|
1316
1304
|
let s: number;
|
1317
1305
|
if (Porffor.type(sec) != Porffor.TYPES.undefined) s = ecma262.ToNumber(sec);
|
@@ -1324,6 +1312,9 @@ export const __Date_prototype_setUTCMinutes = (_this: any, min: any, sec: any, m
|
|
1324
1312
|
// 9. If ms is not present, let milli be msFromTime(t).
|
1325
1313
|
else milli = __ecma262_msFromTime(t);
|
1326
1314
|
|
1315
|
+
// 7. If t is NaN, return NaN.
|
1316
|
+
if (Number.isNaN(t)) return NaN;
|
1317
|
+
|
1327
1318
|
// 10. Let date be MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)).
|
1328
1319
|
const date: number = __ecma262_MakeDate(__ecma262_Day(t), __ecma262_MakeTime(__ecma262_HourFromTime(t), m, s, milli));
|
1329
1320
|
|
@@ -1348,17 +1339,15 @@ export const __Date_prototype_setUTCMonth = (_this: any, month: any, date: any)
|
|
1348
1339
|
// 4. Let m be ? ToNumber(month).
|
1349
1340
|
const m: number = ecma262.ToNumber(month);
|
1350
1341
|
|
1351
|
-
// we reorder the spec steps in this func for easier arg handling
|
1352
|
-
|
1353
|
-
// 6. If t is NaN, return NaN.
|
1354
|
-
if (Number.isNaN(t)) return NaN;
|
1355
|
-
|
1356
1342
|
// 5. If date is present, let dt be ? ToNumber(date).
|
1357
1343
|
let dt: number;
|
1358
1344
|
if (Porffor.type(date) != Porffor.TYPES.undefined) dt = ecma262.ToNumber(date);
|
1359
1345
|
// 7. If date is not present, let dt be DateFromTime(t).
|
1360
1346
|
else dt = __ecma262_DateFromTime(t);
|
1361
1347
|
|
1348
|
+
// 6. If t is NaN, return NaN.
|
1349
|
+
if (Number.isNaN(t)) return NaN;
|
1350
|
+
|
1362
1351
|
// 8. Let newDate be MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).
|
1363
1352
|
const newDate: number = __ecma262_MakeDate(__ecma262_MakeDay(__ecma262_YearFromTime(t), m, dt), __ecma262_TimeWithinDay(t));
|
1364
1353
|
|
@@ -81,22 +81,22 @@ export const __Object_values = (obj: any): any[] => {
|
|
81
81
|
|
82
82
|
let i: i32 = 0;
|
83
83
|
for (; ptr < endPtr; ptr += 18) {
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
local.
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
84
|
+
const tail: i32 = Porffor.wasm.i32.load16_u(ptr, 0, 16);
|
85
|
+
if (!(tail & 0b0100)) continue; // not enumerable
|
86
|
+
|
87
|
+
if (tail & 0b0001) {
|
88
|
+
// accessor
|
89
|
+
const get: Function = Porffor.object.accessorGet(ptr);
|
90
|
+
if (Porffor.wasm`local.get ${get}` == 0) {
|
91
|
+
out[i++] = undefined;
|
92
|
+
continue;
|
93
|
+
}
|
94
|
+
|
95
|
+
out[i++] = get.call(obj);
|
96
|
+
continue;
|
97
|
+
}
|
98
98
|
|
99
|
-
out[i++] =
|
99
|
+
out[i++] = Porffor.object.readValue(ptr);
|
100
100
|
}
|
101
101
|
|
102
102
|
out.length = i;
|
@@ -731,7 +731,6 @@ export const __Porffor_object_spread = (dst: object, src: any): object => {
|
|
731
731
|
|
732
732
|
const len: i32 = keys.length;
|
733
733
|
for (let i: i32 = 0; i < len; i++) {
|
734
|
-
// target[keys[i]] = vals[i];
|
735
734
|
Porffor.object.expr.init(dst, keys[i], vals[i]);
|
736
735
|
}
|
737
736
|
|