jz 0.1.1 → 0.2.0

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/module/date.js ADDED
@@ -0,0 +1,691 @@
1
+ /**
2
+ * Date module — deterministic UTC algorithms first.
3
+ *
4
+ * Current scope: Date.UTC(...), Date object construction, UTC getters/setters,
5
+ * toISOString, toUTCString. Local-time methods, parsing, and locale-sensitive
6
+ * formatting are deliberately staged later.
7
+ *
8
+ * @module date
9
+ */
10
+
11
+ import { typed, asF64, toNumF64, allocPtr } from '../src/ir.js'
12
+ import { emit } from '../src/emit.js'
13
+ import { inc, PTR } from '../src/ctx.js'
14
+ import { VAL } from '../src/analyze.js'
15
+
16
+ const MS_PER_DAY = 86400000
17
+ const MAX_TIME = 8640000000000000
18
+
19
+ export default (ctx) => {
20
+ Object.assign(ctx.core.stdlibDeps, {
21
+ __date_days_from_year: [],
22
+ __date_make_day: ['__date_days_from_year'],
23
+ __date_make_time: [],
24
+ __date_time_clip: [],
25
+ __date_utc: ['__date_make_day', '__date_make_time', '__date_time_clip'],
26
+ __date_day: [],
27
+ __date_time_within_day: ['__date_day'],
28
+ __date_weekday: ['__date_day'],
29
+ __date_year_from_time: ['__date_days_from_year'],
30
+ __date_in_leap_year: ['__date_year_from_time', '__date_days_from_year'],
31
+ __date_day_within_year: ['__date_day', '__date_year_from_time', '__date_days_from_year'],
32
+ __date_month_from_time: ['__date_day_within_year', '__date_in_leap_year'],
33
+ __date_month_start: [],
34
+ __date_date_from_time: ['__date_day_within_year', '__date_month_from_time', '__date_in_leap_year', '__date_month_start'],
35
+ __date_hour_from_time: ['__date_time_within_day'],
36
+ __date_min_from_time: ['__date_time_within_day', '__date_hour_from_time'],
37
+ __date_sec_from_time: ['__date_time_within_day', '__date_hour_from_time', '__date_min_from_time'],
38
+ __date_ms_from_time: ['__date_time_within_day', '__date_hour_from_time', '__date_min_from_time', '__date_sec_from_time'],
39
+ __date_set_time: ['__date_time_clip'],
40
+ __date_set_utc_date: ['__date_set_time', '__date_make_day', '__date_year_from_time', '__date_month_from_time', '__date_time_within_day'],
41
+ __date_set_utc_month: ['__date_set_time', '__date_make_day', '__date_year_from_time', '__date_time_within_day'],
42
+ __date_set_utc_full_year: ['__date_set_time', '__date_make_day', '__date_time_within_day'],
43
+ __date_set_utc_hours: ['__date_set_time', '__date_day', '__date_make_time'],
44
+ __date_set_utc_minutes: ['__date_set_time', '__date_day', '__date_make_time', '__date_hour_from_time'],
45
+ __date_set_utc_seconds: ['__date_set_time', '__date_day', '__date_make_time', '__date_hour_from_time', '__date_min_from_time'],
46
+ __date_set_utc_milliseconds: ['__date_set_time', '__date_day', '__date_make_time', '__date_hour_from_time', '__date_min_from_time', '__date_sec_from_time'],
47
+ __date_write2: [],
48
+ __date_write3: [],
49
+ __date_write4: [],
50
+ __date_to_iso_string: ['__mkstr', '__alloc', '__itoa', '__date_year_from_time', '__date_month_from_time', '__date_date_from_time', '__date_hour_from_time', '__date_min_from_time', '__date_sec_from_time', '__date_ms_from_time', '__date_write2', '__date_write3', '__date_write4'],
51
+ __date_to_utc_string: ['__mkstr', '__alloc', '__itoa', '__date_weekday', '__date_date_from_time', '__date_month_from_time', '__date_year_from_time', '__date_hour_from_time', '__date_min_from_time', '__date_sec_from_time', '__date_write2', '__date_write4'],
52
+ })
53
+
54
+ const dateArg = (node, fallback, required = false) => {
55
+ if (node === undefined) return typed(['f64.const', required ? NaN : fallback], 'f64')
56
+ if (Array.isArray(node) && node[0] == null && node[1] === undefined) return typed(['f64.const', NaN], 'f64')
57
+ return toNumF64(node, emit(node))
58
+ }
59
+
60
+ const missingArg = (node) => node === undefined
61
+
62
+ ctx.core.emit['Date.UTC'] = (year, month, date, hours, minutes, seconds, ms) => {
63
+ inc('__date_utc')
64
+ return typed(['call', '$__date_utc',
65
+ asF64(dateArg(year, NaN, true)),
66
+ asF64(dateArg(month, 0)),
67
+ asF64(dateArg(date, 1)),
68
+ asF64(dateArg(hours, 0)),
69
+ asF64(dateArg(minutes, 0)),
70
+ asF64(dateArg(seconds, 0)),
71
+ asF64(dateArg(ms, 0)),
72
+ ], 'f64')
73
+ }
74
+
75
+ // ── Core algorithms ───────────────────────────────────────────────────────
76
+
77
+ ctx.core.stdlib['__date_days_from_year'] = `(func $__date_days_from_year (param $y f64) (result f64)
78
+ (f64.add
79
+ (f64.add
80
+ (f64.mul (f64.const 365) (f64.sub (local.get $y) (f64.const 1970)))
81
+ (f64.floor (f64.div (f64.sub (local.get $y) (f64.const 1969)) (f64.const 4))))
82
+ (f64.sub
83
+ (f64.floor (f64.div (f64.sub (local.get $y) (f64.const 1601)) (f64.const 400)))
84
+ (f64.floor (f64.div (f64.sub (local.get $y) (f64.const 1901)) (f64.const 100))))))`
85
+
86
+ ctx.core.stdlib['__date_make_day'] = `(func $__date_make_day (param $year f64) (param $month f64) (param $date f64) (result f64)
87
+ (local $y f64) (local $m f64) (local $dt f64) (local $q f64) (local $ym f64) (local $mn f64)
88
+ (local $mi i32) (local $leap f64) (local $day f64)
89
+ (local.set $y (f64.trunc (local.get $year)))
90
+ (local.set $m (f64.trunc (local.get $month)))
91
+ (local.set $dt (f64.trunc (local.get $date)))
92
+ (local.set $q (f64.floor (f64.div (local.get $m) (f64.const 12))))
93
+ (local.set $ym (f64.add (local.get $y) (local.get $q)))
94
+ (local.set $mn (f64.sub (local.get $m) (f64.mul (local.get $q) (f64.const 12))))
95
+ (local.set $mi (i32.trunc_sat_f64_s (local.get $mn)))
96
+ (local.set $leap
97
+ (if (result f64)
98
+ (f64.eq
99
+ (f64.sub
100
+ (call $__date_days_from_year (f64.add (local.get $ym) (f64.const 1)))
101
+ (call $__date_days_from_year (local.get $ym)))
102
+ (f64.const 366))
103
+ (then (f64.const 1))
104
+ (else (f64.const 0))))
105
+ (if (i32.ge_s (local.get $mi) (i32.const 1)) (then (local.set $day (f64.const 31))))
106
+ (if (i32.ge_s (local.get $mi) (i32.const 2)) (then (local.set $day (f64.add (f64.const 59) (local.get $leap)))))
107
+ (if (i32.ge_s (local.get $mi) (i32.const 3)) (then (local.set $day (f64.add (f64.const 90) (local.get $leap)))))
108
+ (if (i32.ge_s (local.get $mi) (i32.const 4)) (then (local.set $day (f64.add (f64.const 120) (local.get $leap)))))
109
+ (if (i32.ge_s (local.get $mi) (i32.const 5)) (then (local.set $day (f64.add (f64.const 151) (local.get $leap)))))
110
+ (if (i32.ge_s (local.get $mi) (i32.const 6)) (then (local.set $day (f64.add (f64.const 181) (local.get $leap)))))
111
+ (if (i32.ge_s (local.get $mi) (i32.const 7)) (then (local.set $day (f64.add (f64.const 212) (local.get $leap)))))
112
+ (if (i32.ge_s (local.get $mi) (i32.const 8)) (then (local.set $day (f64.add (f64.const 243) (local.get $leap)))))
113
+ (if (i32.ge_s (local.get $mi) (i32.const 9)) (then (local.set $day (f64.add (f64.const 273) (local.get $leap)))))
114
+ (if (i32.ge_s (local.get $mi) (i32.const 10)) (then (local.set $day (f64.add (f64.const 304) (local.get $leap)))))
115
+ (if (i32.ge_s (local.get $mi) (i32.const 11)) (then (local.set $day (f64.add (f64.const 334) (local.get $leap)))))
116
+ (f64.add
117
+ (f64.add (call $__date_days_from_year (local.get $ym)) (local.get $day))
118
+ (f64.sub (local.get $dt) (f64.const 1))))`
119
+
120
+ ctx.core.stdlib['__date_make_time'] = `(func $__date_make_time (param $hour f64) (param $min f64) (param $sec f64) (param $ms f64) (result f64)
121
+ (f64.add
122
+ (f64.add
123
+ (f64.mul (f64.trunc (local.get $hour)) (f64.const 3600000))
124
+ (f64.mul (f64.trunc (local.get $min)) (f64.const 60000)))
125
+ (f64.add
126
+ (f64.mul (f64.trunc (local.get $sec)) (f64.const 1000))
127
+ (f64.trunc (local.get $ms)))))`
128
+
129
+ ctx.core.stdlib['__date_time_clip'] = `(func $__date_time_clip (param $time f64) (result f64)
130
+ (if (result f64)
131
+ (i32.or
132
+ (f64.ne (local.get $time) (local.get $time))
133
+ (f64.gt (f64.abs (local.get $time)) (f64.const ${MAX_TIME})))
134
+ (then (f64.const nan))
135
+ (else (f64.add (f64.trunc (local.get $time)) (f64.const 0)))))`
136
+
137
+ ctx.core.stdlib['__date_utc'] = `(func $__date_utc (param $year f64) (param $month f64) (param $date f64) (param $hours f64) (param $minutes f64) (param $seconds f64) (param $ms f64) (result f64)
138
+ (local $y f64)
139
+ (local.set $y (f64.trunc (local.get $year)))
140
+ (if
141
+ (i32.and
142
+ (f64.eq (local.get $y) (local.get $y))
143
+ (i32.and (f64.ge (local.get $y) (f64.const 0)) (f64.le (local.get $y) (f64.const 99))))
144
+ (then (local.set $y (f64.add (local.get $y) (f64.const 1900)))))
145
+ (call $__date_time_clip
146
+ (f64.add
147
+ (f64.mul
148
+ (call $__date_make_day (local.get $y) (local.get $month) (local.get $date))
149
+ (f64.const ${MS_PER_DAY}))
150
+ (call $__date_make_time (local.get $hours) (local.get $minutes) (local.get $seconds) (local.get $ms)))))`
151
+
152
+ // ── Time decomposition (ECMA-262 §21.4.1) ────────────────────────────────
153
+
154
+ ctx.core.stdlib['__date_day'] = `(func $__date_day (param $t f64) (result f64)
155
+ (f64.floor (f64.div (local.get $t) (f64.const ${MS_PER_DAY}))))`
156
+
157
+ ctx.core.stdlib['__date_time_within_day'] = `(func $__date_time_within_day (param $t f64) (result f64)
158
+ (f64.sub (local.get $t) (f64.mul (call $__date_day (local.get $t)) (f64.const ${MS_PER_DAY}))))`
159
+
160
+ ctx.core.stdlib['__date_weekday'] = `(func $__date_weekday (param $t f64) (result f64)
161
+ (local $wd i32)
162
+ (if (f64.ne (local.get $t) (local.get $t)) (then (return (f64.const nan))))
163
+ (local.set $wd (i32.rem_s (i32.add (i32.trunc_sat_f64_s (call $__date_day (local.get $t))) (i32.const 4)) (i32.const 7)))
164
+ (if (i32.lt_s (local.get $wd) (i32.const 0)) (then (local.set $wd (i32.add (local.get $wd) (i32.const 7)))))
165
+ (f64.convert_i32_s (local.get $wd)))`
166
+
167
+ ctx.core.stdlib['__date_year_from_time'] = `(func $__date_year_from_time (param $t f64) (result f64)
168
+ (local $day f64) (local $y f64)
169
+ (if (f64.ne (local.get $t) (local.get $t)) (then (return (f64.const nan))))
170
+ (local.set $day (call $__date_day (local.get $t)))
171
+ (local.set $y (f64.floor (f64.add (f64.const 1970) (f64.div (local.get $day) (f64.const 365.2425)))))
172
+ (if (f64.gt (call $__date_days_from_year (local.get $y)) (local.get $day))
173
+ (then (local.set $y (f64.sub (local.get $y) (f64.const 1)))))
174
+ (if (f64.le (call $__date_days_from_year (f64.add (local.get $y) (f64.const 1))) (local.get $day))
175
+ (then (local.set $y (f64.add (local.get $y) (f64.const 1)))))
176
+ (local.get $y))`
177
+
178
+ ctx.core.stdlib['__date_in_leap_year'] = `(func $__date_in_leap_year (param $t f64) (result f64)
179
+ (local $y f64)
180
+ (local.set $y (call $__date_year_from_time (local.get $t)))
181
+ (if (result f64)
182
+ (f64.eq (f64.sub (call $__date_days_from_year (f64.add (local.get $y) (f64.const 1))) (call $__date_days_from_year (local.get $y))) (f64.const 366))
183
+ (then (f64.const 1))
184
+ (else (f64.const 0))))`
185
+
186
+ ctx.core.stdlib['__date_day_within_year'] = `(func $__date_day_within_year (param $t f64) (result f64)
187
+ (f64.sub (call $__date_day (local.get $t)) (call $__date_days_from_year (call $__date_year_from_time (local.get $t)))))`
188
+
189
+ ctx.core.stdlib['__date_month_from_time'] = `(func $__date_month_from_time (param $t f64) (result f64)
190
+ (local $dwy i32) (local $leap i32) (local $m i32)
191
+ (if (f64.ne (local.get $t) (local.get $t)) (then (return (f64.const nan))))
192
+ (local.set $dwy (i32.trunc_sat_f64_s (call $__date_day_within_year (local.get $t))))
193
+ (local.set $leap (i32.trunc_sat_f64_s (call $__date_in_leap_year (local.get $t))))
194
+ (local.set $m (i32.const 0))
195
+ (if (i32.ge_s (local.get $dwy) (i32.const 31)) (then (local.set $m (i32.const 1))))
196
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 59) (local.get $leap))) (then (local.set $m (i32.const 2))))
197
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 90) (local.get $leap))) (then (local.set $m (i32.const 3))))
198
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 120) (local.get $leap))) (then (local.set $m (i32.const 4))))
199
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 151) (local.get $leap))) (then (local.set $m (i32.const 5))))
200
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 181) (local.get $leap))) (then (local.set $m (i32.const 6))))
201
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 212) (local.get $leap))) (then (local.set $m (i32.const 7))))
202
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 243) (local.get $leap))) (then (local.set $m (i32.const 8))))
203
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 273) (local.get $leap))) (then (local.set $m (i32.const 9))))
204
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 304) (local.get $leap))) (then (local.set $m (i32.const 10))))
205
+ (if (i32.ge_s (local.get $dwy) (i32.add (i32.const 334) (local.get $leap))) (then (local.set $m (i32.const 11))))
206
+ (f64.convert_i32_s (local.get $m)))`
207
+
208
+ ctx.core.stdlib['__date_month_start'] = `(func $__date_month_start (param $month i32) (param $leap i32) (result i32)
209
+ (if (i32.eq (local.get $month) (i32.const 0)) (then (return (i32.const 0))))
210
+ (if (i32.eq (local.get $month) (i32.const 1)) (then (return (i32.const 31))))
211
+ (if (i32.eq (local.get $month) (i32.const 2)) (then (return (i32.add (i32.const 59) (local.get $leap)))))
212
+ (if (i32.eq (local.get $month) (i32.const 3)) (then (return (i32.add (i32.const 90) (local.get $leap)))))
213
+ (if (i32.eq (local.get $month) (i32.const 4)) (then (return (i32.add (i32.const 120) (local.get $leap)))))
214
+ (if (i32.eq (local.get $month) (i32.const 5)) (then (return (i32.add (i32.const 151) (local.get $leap)))))
215
+ (if (i32.eq (local.get $month) (i32.const 6)) (then (return (i32.add (i32.const 181) (local.get $leap)))))
216
+ (if (i32.eq (local.get $month) (i32.const 7)) (then (return (i32.add (i32.const 212) (local.get $leap)))))
217
+ (if (i32.eq (local.get $month) (i32.const 8)) (then (return (i32.add (i32.const 243) (local.get $leap)))))
218
+ (if (i32.eq (local.get $month) (i32.const 9)) (then (return (i32.add (i32.const 273) (local.get $leap)))))
219
+ (if (i32.eq (local.get $month) (i32.const 10)) (then (return (i32.add (i32.const 304) (local.get $leap)))))
220
+ (if (i32.eq (local.get $month) (i32.const 11)) (then (return (i32.add (i32.const 334) (local.get $leap)))))
221
+ (i32.const 334))`
222
+
223
+ ctx.core.stdlib['__date_date_from_time'] = `(func $__date_date_from_time (param $t f64) (result f64)
224
+ (local $dwy i32) (local $m i32) (local $leap i32)
225
+ (if (f64.ne (local.get $t) (local.get $t)) (then (return (f64.const nan))))
226
+ (local.set $dwy (i32.trunc_sat_f64_s (call $__date_day_within_year (local.get $t))))
227
+ (local.set $m (i32.trunc_sat_f64_s (call $__date_month_from_time (local.get $t))))
228
+ (local.set $leap (i32.trunc_sat_f64_s (call $__date_in_leap_year (local.get $t))))
229
+ (f64.convert_i32_s (i32.add (i32.sub (local.get $dwy) (call $__date_month_start (local.get $m) (local.get $leap))) (i32.const 1))))`
230
+
231
+ ctx.core.stdlib['__date_hour_from_time'] = `(func $__date_hour_from_time (param $t f64) (result f64)
232
+ (f64.floor (f64.div (call $__date_time_within_day (local.get $t)) (f64.const 3600000))))`
233
+
234
+ ctx.core.stdlib['__date_min_from_time'] = `(func $__date_min_from_time (param $t f64) (result f64)
235
+ (f64.floor (f64.div (f64.sub (call $__date_time_within_day (local.get $t)) (f64.mul (call $__date_hour_from_time (local.get $t)) (f64.const 3600000))) (f64.const 60000))))`
236
+
237
+ ctx.core.stdlib['__date_sec_from_time'] = `(func $__date_sec_from_time (param $t f64) (result f64)
238
+ (f64.floor (f64.div (f64.sub (f64.sub (call $__date_time_within_day (local.get $t)) (f64.mul (call $__date_hour_from_time (local.get $t)) (f64.const 3600000))) (f64.mul (call $__date_min_from_time (local.get $t)) (f64.const 60000))) (f64.const 1000))))`
239
+
240
+ ctx.core.stdlib['__date_ms_from_time'] = `(func $__date_ms_from_time (param $t f64) (result f64)
241
+ (f64.sub (f64.sub (f64.sub (call $__date_time_within_day (local.get $t)) (f64.mul (call $__date_hour_from_time (local.get $t)) (f64.const 3600000))) (f64.mul (call $__date_min_from_time (local.get $t)) (f64.const 60000))) (f64.mul (call $__date_sec_from_time (local.get $t)) (f64.const 1000))))`
242
+
243
+ // ── Setter helpers ────────────────────────────────────────────────────────
244
+
245
+ ctx.core.stdlib['__date_set_time'] = `(func $__date_set_time (param $ptr i32) (param $day f64) (param $time f64) (result f64)
246
+ (local $v f64)
247
+ (local.set $v (call $__date_time_clip (f64.add (f64.mul (local.get $day) (f64.const ${MS_PER_DAY})) (local.get $time))))
248
+ (f64.store (local.get $ptr) (local.get $v))
249
+ (local.get $v))`
250
+
251
+ ctx.core.stdlib['__date_set_utc_date'] = `(func $__date_set_utc_date (param $ptr i32) (param $t f64) (param $dt f64) (result f64)
252
+ (call $__date_set_time (local.get $ptr)
253
+ (call $__date_make_day (call $__date_year_from_time (local.get $t)) (call $__date_month_from_time (local.get $t)) (local.get $dt))
254
+ (call $__date_time_within_day (local.get $t))))`
255
+
256
+ ctx.core.stdlib['__date_set_utc_month'] = `(func $__date_set_utc_month (param $ptr i32) (param $t f64) (param $m f64) (param $dt f64) (result f64)
257
+ (call $__date_set_time (local.get $ptr)
258
+ (call $__date_make_day (call $__date_year_from_time (local.get $t)) (local.get $m) (local.get $dt))
259
+ (call $__date_time_within_day (local.get $t))))`
260
+
261
+ ctx.core.stdlib['__date_set_utc_full_year'] = `(func $__date_set_utc_full_year (param $ptr i32) (param $t f64) (param $y f64) (param $m f64) (param $dt f64) (result f64)
262
+ (if (f64.ne (local.get $t) (local.get $t))
263
+ (then (local.set $t (f64.const 0))))
264
+ (call $__date_set_time (local.get $ptr)
265
+ (call $__date_make_day (local.get $y) (local.get $m) (local.get $dt))
266
+ (call $__date_time_within_day (local.get $t))))`
267
+
268
+ ctx.core.stdlib['__date_set_utc_hours'] = `(func $__date_set_utc_hours (param $ptr i32) (param $t f64) (param $h f64) (param $m f64) (param $s f64) (param $ms f64) (result f64)
269
+ (call $__date_set_time (local.get $ptr)
270
+ (call $__date_day (local.get $t))
271
+ (call $__date_make_time (local.get $h) (local.get $m) (local.get $s) (local.get $ms))))`
272
+
273
+ ctx.core.stdlib['__date_set_utc_minutes'] = `(func $__date_set_utc_minutes (param $ptr i32) (param $t f64) (param $m f64) (param $s f64) (param $ms f64) (result f64)
274
+ (call $__date_set_time (local.get $ptr)
275
+ (call $__date_day (local.get $t))
276
+ (call $__date_make_time (call $__date_hour_from_time (local.get $t)) (local.get $m) (local.get $s) (local.get $ms))))`
277
+
278
+ ctx.core.stdlib['__date_set_utc_seconds'] = `(func $__date_set_utc_seconds (param $ptr i32) (param $t f64) (param $s f64) (param $ms f64) (result f64)
279
+ (call $__date_set_time (local.get $ptr)
280
+ (call $__date_day (local.get $t))
281
+ (call $__date_make_time (call $__date_hour_from_time (local.get $t)) (call $__date_min_from_time (local.get $t)) (local.get $s) (local.get $ms))))`
282
+
283
+ ctx.core.stdlib['__date_set_utc_milliseconds'] = `(func $__date_set_utc_milliseconds (param $ptr i32) (param $t f64) (param $ms f64) (result f64)
284
+ (call $__date_set_time (local.get $ptr)
285
+ (call $__date_day (local.get $t))
286
+ (call $__date_make_time (call $__date_hour_from_time (local.get $t)) (call $__date_min_from_time (local.get $t)) (call $__date_sec_from_time (local.get $t)) (local.get $ms))))`
287
+
288
+ // ── Digit formatters ──────────────────────────────────────────────────────
289
+
290
+ ctx.core.stdlib['__date_write2'] = `(func $__date_write2 (param $buf i32) (param $v i32)
291
+ (i32.store8 (local.get $buf) (i32.add (i32.const 48) (i32.div_u (local.get $v) (i32.const 10))))
292
+ (i32.store8 (i32.add (local.get $buf) (i32.const 1)) (i32.add (i32.const 48) (i32.rem_u (local.get $v) (i32.const 10)))))`
293
+
294
+ ctx.core.stdlib['__date_write3'] = `(func $__date_write3 (param $buf i32) (param $v i32)
295
+ (local $d i32)
296
+ (local.set $d (i32.div_u (local.get $v) (i32.const 100)))
297
+ (i32.store8 (local.get $buf) (i32.add (i32.const 48) (local.get $d)))
298
+ (local.set $v (i32.rem_u (local.get $v) (i32.const 100)))
299
+ (local.set $d (i32.div_u (local.get $v) (i32.const 10)))
300
+ (i32.store8 (i32.add (local.get $buf) (i32.const 1)) (i32.add (i32.const 48) (local.get $d)))
301
+ (i32.store8 (i32.add (local.get $buf) (i32.const 2)) (i32.add (i32.const 48) (i32.rem_u (local.get $v) (i32.const 10)))))`
302
+
303
+ ctx.core.stdlib['__date_write4'] = `(func $__date_write4 (param $buf i32) (param $v i32)
304
+ (local $d i32)
305
+ (local.set $d (i32.div_u (local.get $v) (i32.const 1000)))
306
+ (i32.store8 (local.get $buf) (i32.add (i32.const 48) (local.get $d)))
307
+ (local.set $v (i32.rem_u (local.get $v) (i32.const 1000)))
308
+ (local.set $d (i32.div_u (local.get $v) (i32.const 100)))
309
+ (i32.store8 (i32.add (local.get $buf) (i32.const 1)) (i32.add (i32.const 48) (local.get $d)))
310
+ (local.set $v (i32.rem_u (local.get $v) (i32.const 100)))
311
+ (local.set $d (i32.div_u (local.get $v) (i32.const 10)))
312
+ (i32.store8 (i32.add (local.get $buf) (i32.const 2)) (i32.add (i32.const 48) (local.get $d)))
313
+ (i32.store8 (i32.add (local.get $buf) (i32.const 3)) (i32.add (i32.const 48) (i32.rem_u (local.get $v) (i32.const 10)))))`
314
+
315
+ // ── toISOString ───────────────────────────────────────────────────────────
316
+
317
+ ctx.core.stdlib['__date_to_iso_string'] = `(func $__date_to_iso_string (param $t f64) (result f64)
318
+ (local $buf i32) (local $p i32) (local $year f64) (local $yv i32) (local $nd i32)
319
+ (if (f64.ne (local.get $t) (local.get $t)) (then (return (call $__mkstr (i32.const 0) (i32.const 0)))))
320
+ (local.set $buf (call $__alloc (i32.const 40)))
321
+ (local.set $p (local.get $buf))
322
+ (local.set $year (call $__date_year_from_time (local.get $t)))
323
+ (if (f64.lt (local.get $year) (f64.const 0))
324
+ (then
325
+ (i32.store8 (local.get $p) (i32.const 45))
326
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
327
+ (local.set $year (f64.neg (local.get $year)))))
328
+ (local.set $yv (i32.trunc_sat_f64_u (local.get $year)))
329
+ (if (i32.le_u (local.get $yv) (i32.const 9999))
330
+ (then
331
+ (call $__date_write4 (local.get $p) (local.get $yv))
332
+ (local.set $p (i32.add (local.get $p) (i32.const 4))))
333
+ (else
334
+ (local.set $nd (call $__itoa (local.get $yv) (local.get $p)))
335
+ (local.set $p (i32.add (local.get $p) (local.get $nd)))))
336
+ (i32.store8 (local.get $p) (i32.const 45))
337
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
338
+ (call $__date_write2 (local.get $p) (i32.add (i32.trunc_sat_f64_s (call $__date_month_from_time (local.get $t))) (i32.const 1)))
339
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
340
+ (i32.store8 (local.get $p) (i32.const 45))
341
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
342
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_date_from_time (local.get $t))))
343
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
344
+ (i32.store8 (local.get $p) (i32.const 84))
345
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
346
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_hour_from_time (local.get $t))))
347
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
348
+ (i32.store8 (local.get $p) (i32.const 58))
349
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
350
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_min_from_time (local.get $t))))
351
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
352
+ (i32.store8 (local.get $p) (i32.const 58))
353
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
354
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_sec_from_time (local.get $t))))
355
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
356
+ (i32.store8 (local.get $p) (i32.const 46))
357
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
358
+ (call $__date_write3 (local.get $p) (i32.trunc_sat_f64_s (call $__date_ms_from_time (local.get $t))))
359
+ (local.set $p (i32.add (local.get $p) (i32.const 3)))
360
+ (i32.store8 (local.get $p) (i32.const 90))
361
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
362
+ (call $__mkstr (local.get $buf) (i32.sub (local.get $p) (local.get $buf))))`
363
+
364
+ // ── toUTCString ───────────────────────────────────────────────────────────
365
+
366
+ ctx.core.stdlib['__date_to_utc_string'] = `(func $__date_to_utc_string (param $t f64) (result f64)
367
+ (local $buf i32) (local $p i32) (local $wd i32) (local $year f64) (local $yv i32) (local $nd i32) (local $month i32)
368
+ (if (f64.ne (local.get $t) (local.get $t)) (then (return (call $__mkstr (i32.const 0) (i32.const 0)))))
369
+ (local.set $buf (call $__alloc (i32.const 48)))
370
+ (local.set $p (local.get $buf))
371
+ (local.set $wd (i32.trunc_sat_f64_s (call $__date_weekday (local.get $t))))
372
+ (if (i32.eq (local.get $wd) (i32.const 0))
373
+ (then
374
+ (i32.store8 (local.get $p) (i32.const 83))
375
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 117))
376
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 110))))
377
+ (if (i32.eq (local.get $wd) (i32.const 1))
378
+ (then
379
+ (i32.store8 (local.get $p) (i32.const 77))
380
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 111))
381
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 110))))
382
+ (if (i32.eq (local.get $wd) (i32.const 2))
383
+ (then
384
+ (i32.store8 (local.get $p) (i32.const 84))
385
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 117))
386
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 101))))
387
+ (if (i32.eq (local.get $wd) (i32.const 3))
388
+ (then
389
+ (i32.store8 (local.get $p) (i32.const 87))
390
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 101))
391
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 100))))
392
+ (if (i32.eq (local.get $wd) (i32.const 4))
393
+ (then
394
+ (i32.store8 (local.get $p) (i32.const 84))
395
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 104))
396
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 117))))
397
+ (if (i32.eq (local.get $wd) (i32.const 5))
398
+ (then
399
+ (i32.store8 (local.get $p) (i32.const 70))
400
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 114))
401
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 105))))
402
+ (if (i32.eq (local.get $wd) (i32.const 6))
403
+ (then
404
+ (i32.store8 (local.get $p) (i32.const 83))
405
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 97))
406
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 116))))
407
+ (local.set $p (i32.add (local.get $p) (i32.const 3)))
408
+ (i32.store8 (local.get $p) (i32.const 44))
409
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 32))
410
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
411
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_date_from_time (local.get $t))))
412
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
413
+ (i32.store8 (local.get $p) (i32.const 32))
414
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
415
+ (local.set $month (i32.trunc_sat_f64_s (call $__date_month_from_time (local.get $t))))
416
+ (if (i32.eq (local.get $month) (i32.const 0))
417
+ (then
418
+ (i32.store8 (local.get $p) (i32.const 74))
419
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 97))
420
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 110))))
421
+ (if (i32.eq (local.get $month) (i32.const 1))
422
+ (then
423
+ (i32.store8 (local.get $p) (i32.const 70))
424
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 101))
425
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 98))))
426
+ (if (i32.eq (local.get $month) (i32.const 2))
427
+ (then
428
+ (i32.store8 (local.get $p) (i32.const 77))
429
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 97))
430
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 114))))
431
+ (if (i32.eq (local.get $month) (i32.const 3))
432
+ (then
433
+ (i32.store8 (local.get $p) (i32.const 65))
434
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 112))
435
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 114))))
436
+ (if (i32.eq (local.get $month) (i32.const 4))
437
+ (then
438
+ (i32.store8 (local.get $p) (i32.const 77))
439
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 97))
440
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 121))))
441
+ (if (i32.eq (local.get $month) (i32.const 5))
442
+ (then
443
+ (i32.store8 (local.get $p) (i32.const 74))
444
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 117))
445
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 110))))
446
+ (if (i32.eq (local.get $month) (i32.const 6))
447
+ (then
448
+ (i32.store8 (local.get $p) (i32.const 74))
449
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 117))
450
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 108))))
451
+ (if (i32.eq (local.get $month) (i32.const 7))
452
+ (then
453
+ (i32.store8 (local.get $p) (i32.const 65))
454
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 117))
455
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 103))))
456
+ (if (i32.eq (local.get $month) (i32.const 8))
457
+ (then
458
+ (i32.store8 (local.get $p) (i32.const 83))
459
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 101))
460
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 112))))
461
+ (if (i32.eq (local.get $month) (i32.const 9))
462
+ (then
463
+ (i32.store8 (local.get $p) (i32.const 79))
464
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 99))
465
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 116))))
466
+ (if (i32.eq (local.get $month) (i32.const 10))
467
+ (then
468
+ (i32.store8 (local.get $p) (i32.const 78))
469
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 111))
470
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 118))))
471
+ (if (i32.eq (local.get $month) (i32.const 11))
472
+ (then
473
+ (i32.store8 (local.get $p) (i32.const 68))
474
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 101))
475
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 99))))
476
+ (local.set $p (i32.add (local.get $p) (i32.const 3)))
477
+ (i32.store8 (local.get $p) (i32.const 32))
478
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
479
+ (local.set $year (call $__date_year_from_time (local.get $t)))
480
+ (if (f64.lt (local.get $year) (f64.const 0))
481
+ (then
482
+ (i32.store8 (local.get $p) (i32.const 45))
483
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
484
+ (local.set $year (f64.neg (local.get $year)))))
485
+ (local.set $yv (i32.trunc_sat_f64_u (local.get $year)))
486
+ (if (i32.le_u (local.get $yv) (i32.const 9999))
487
+ (then
488
+ (call $__date_write4 (local.get $p) (local.get $yv))
489
+ (local.set $p (i32.add (local.get $p) (i32.const 4))))
490
+ (else
491
+ (local.set $nd (call $__itoa (local.get $yv) (local.get $p)))
492
+ (local.set $p (i32.add (local.get $p) (local.get $nd)))))
493
+ (i32.store8 (local.get $p) (i32.const 32))
494
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
495
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_hour_from_time (local.get $t))))
496
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
497
+ (i32.store8 (local.get $p) (i32.const 58))
498
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
499
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_min_from_time (local.get $t))))
500
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
501
+ (i32.store8 (local.get $p) (i32.const 58))
502
+ (local.set $p (i32.add (local.get $p) (i32.const 1)))
503
+ (call $__date_write2 (local.get $p) (i32.trunc_sat_f64_s (call $__date_sec_from_time (local.get $t))))
504
+ (local.set $p (i32.add (local.get $p) (i32.const 2)))
505
+ (i32.store8 (local.get $p) (i32.const 32))
506
+ (i32.store8 (i32.add (local.get $p) (i32.const 1)) (i32.const 71))
507
+ (i32.store8 (i32.add (local.get $p) (i32.const 2)) (i32.const 77))
508
+ (i32.store8 (i32.add (local.get $p) (i32.const 3)) (i32.const 84))
509
+ (local.set $p (i32.add (local.get $p) (i32.const 4)))
510
+ (call $__mkstr (local.get $buf) (i32.sub (local.get $p) (local.get $buf))))`
511
+
512
+ // === Minimal Date value object ===
513
+ // Represented as PTR.OBJECT with a single f64 slot at offset 0 (the time value).
514
+ // No schemaId (aux=0); dynamic property access falls through to undefined.
515
+
516
+ ctx.core.emit['new.Date'] = (ms) => {
517
+ let timeVal
518
+ if (ms === undefined || ms === null) {
519
+ timeVal = typed(['f64.const', NaN], 'f64')
520
+ } else {
521
+ inc('__date_time_clip')
522
+ timeVal = typed(['call', '$__date_time_clip', toNumF64(ms, emit(ms))], 'f64')
523
+ }
524
+ const out = allocPtr({ type: PTR.OBJECT, len: 1, cap: 1, stride: 8, tag: 'date' })
525
+ return typed(['block', ['result', 'f64'],
526
+ out.init,
527
+ ['f64.store', ['local.get', `$${out.local}`], timeVal],
528
+ out.ptr], 'f64')
529
+ }
530
+
531
+ const emitDateGetTime = (dateExpr) => {
532
+ const d = asF64(emit(dateExpr))
533
+ return typed(['f64.load', ['i32.wrap_i64', ['i64.reinterpret_f64', d]]], 'f64')
534
+ }
535
+
536
+ const emitDateSetTime = (dateExpr, ms) => {
537
+ inc('__date_time_clip')
538
+ const d = asF64(emit(dateExpr))
539
+ const t = typed(['call', '$__date_time_clip', toNumF64(ms, emit(ms))], 'f64')
540
+ return typed(['block', ['result', 'f64'],
541
+ ['f64.store', ['i32.wrap_i64', ['i64.reinterpret_f64', d]], t],
542
+ t], 'f64')
543
+ }
544
+
545
+ ctx.core.emit['.getTime'] = emitDateGetTime
546
+ ctx.core.emit[`.${VAL.DATE}:getTime`] = emitDateGetTime
547
+
548
+ ctx.core.emit['.valueOf'] = emitDateGetTime
549
+ ctx.core.emit[`.${VAL.DATE}:valueOf`] = emitDateGetTime
550
+
551
+ ctx.core.emit['.setTime'] = emitDateSetTime
552
+ ctx.core.emit[`.${VAL.DATE}:setTime`] = emitDateSetTime
553
+
554
+ // ── UTC getter emit handlers ──────────────────────────────────────────────
555
+
556
+ const emitDateLoad = (dateExpr) =>
557
+ typed(['f64.load', ['i32.wrap_i64', ['i64.reinterpret_f64', asF64(emit(dateExpr))]]], 'f64')
558
+
559
+ const dateGetter = (fn) => (dateExpr) => {
560
+ inc(fn)
561
+ return typed(['call', `$${fn}`, emitDateLoad(dateExpr)], 'f64')
562
+ }
563
+
564
+ ctx.core.emit['.getUTCFullYear'] = dateGetter('__date_year_from_time')
565
+ ctx.core.emit[`.${VAL.DATE}:getUTCFullYear`] = dateGetter('__date_year_from_time')
566
+
567
+ ctx.core.emit['.getUTCMonth'] = dateGetter('__date_month_from_time')
568
+ ctx.core.emit[`.${VAL.DATE}:getUTCMonth`] = dateGetter('__date_month_from_time')
569
+
570
+ ctx.core.emit['.getUTCDate'] = dateGetter('__date_date_from_time')
571
+ ctx.core.emit[`.${VAL.DATE}:getUTCDate`] = dateGetter('__date_date_from_time')
572
+
573
+ ctx.core.emit['.getUTCDay'] = dateGetter('__date_weekday')
574
+ ctx.core.emit[`.${VAL.DATE}:getUTCDay`] = dateGetter('__date_weekday')
575
+
576
+ ctx.core.emit['.getUTCHours'] = dateGetter('__date_hour_from_time')
577
+ ctx.core.emit[`.${VAL.DATE}:getUTCHours`] = dateGetter('__date_hour_from_time')
578
+
579
+ ctx.core.emit['.getUTCMinutes'] = dateGetter('__date_min_from_time')
580
+ ctx.core.emit[`.${VAL.DATE}:getUTCMinutes`] = dateGetter('__date_min_from_time')
581
+
582
+ ctx.core.emit['.getUTCSeconds'] = dateGetter('__date_sec_from_time')
583
+ ctx.core.emit[`.${VAL.DATE}:getUTCSeconds`] = dateGetter('__date_sec_from_time')
584
+
585
+ ctx.core.emit['.getUTCMilliseconds'] = dateGetter('__date_ms_from_time')
586
+ ctx.core.emit[`.${VAL.DATE}:getUTCMilliseconds`] = dateGetter('__date_ms_from_time')
587
+
588
+ // ── UTC setter emit handlers ──────────────────────────────────────────────
589
+
590
+ const emitDatePtr = (dateExpr) =>
591
+ ['i32.wrap_i64', ['i64.reinterpret_f64', asF64(emit(dateExpr))]]
592
+
593
+ ctx.core.emit['.setUTCDate'] = (dateExpr, dt) => {
594
+ inc('__date_set_utc_date')
595
+ return typed(['call', '$__date_set_utc_date', emitDatePtr(dateExpr), emitDateLoad(dateExpr), asF64(toNumF64(dt, emit(dt)))], 'f64')
596
+ }
597
+ ctx.core.emit[`.${VAL.DATE}:setUTCDate`] = ctx.core.emit['.setUTCDate']
598
+
599
+ ctx.core.emit['.setUTCMonth'] = (dateExpr, month, dt) => {
600
+ inc('__date_set_utc_month')
601
+ const m = asF64(toNumF64(month, emit(month)))
602
+ const t = emitDateLoad(dateExpr)
603
+ const d = missingArg(dt)
604
+ ? (inc('__date_date_from_time'), typed(['call', '$__date_date_from_time', t], 'f64'))
605
+ : asF64(toNumF64(dt, emit(dt)))
606
+ return typed(['call', '$__date_set_utc_month', emitDatePtr(dateExpr), t, m, d], 'f64')
607
+ }
608
+ ctx.core.emit[`.${VAL.DATE}:setUTCMonth`] = ctx.core.emit['.setUTCMonth']
609
+
610
+ ctx.core.emit['.setUTCFullYear'] = (dateExpr, year, month, dt) => {
611
+ inc('__date_set_utc_full_year')
612
+ const y = asF64(toNumF64(year, emit(year)))
613
+ const t = emitDateLoad(dateExpr)
614
+ const m = missingArg(month)
615
+ ? (inc('__date_month_from_time'), typed(['if', ['result', 'f64'],
616
+ ['f64.ne', t, t],
617
+ ['then', ['f64.const', 0]],
618
+ ['else', ['call', '$__date_month_from_time', t]]], 'f64'))
619
+ : asF64(toNumF64(month, emit(month)))
620
+ const d = missingArg(dt)
621
+ ? (inc('__date_date_from_time'), typed(['if', ['result', 'f64'],
622
+ ['f64.ne', t, t],
623
+ ['then', ['f64.const', 1]],
624
+ ['else', ['call', '$__date_date_from_time', t]]], 'f64'))
625
+ : asF64(toNumF64(dt, emit(dt)))
626
+ return typed(['call', '$__date_set_utc_full_year', emitDatePtr(dateExpr), t, y, m, d], 'f64')
627
+ }
628
+ ctx.core.emit[`.${VAL.DATE}:setUTCFullYear`] = ctx.core.emit['.setUTCFullYear']
629
+
630
+ ctx.core.emit['.setUTCHours'] = (dateExpr, hour, min, sec, ms) => {
631
+ inc('__date_set_utc_hours')
632
+ const h = asF64(toNumF64(hour, emit(hour)))
633
+ const t = emitDateLoad(dateExpr)
634
+ const m = missingArg(min)
635
+ ? (inc('__date_min_from_time'), typed(['call', '$__date_min_from_time', t], 'f64'))
636
+ : asF64(toNumF64(min, emit(min)))
637
+ const s = missingArg(sec)
638
+ ? (inc('__date_sec_from_time'), typed(['call', '$__date_sec_from_time', t], 'f64'))
639
+ : asF64(toNumF64(sec, emit(sec)))
640
+ const msec = missingArg(ms)
641
+ ? (inc('__date_ms_from_time'), typed(['call', '$__date_ms_from_time', t], 'f64'))
642
+ : asF64(toNumF64(ms, emit(ms)))
643
+ return typed(['call', '$__date_set_utc_hours', emitDatePtr(dateExpr), t, h, m, s, msec], 'f64')
644
+ }
645
+ ctx.core.emit[`.${VAL.DATE}:setUTCHours`] = ctx.core.emit['.setUTCHours']
646
+
647
+ ctx.core.emit['.setUTCMinutes'] = (dateExpr, min, sec, ms) => {
648
+ inc('__date_set_utc_minutes')
649
+ const m = asF64(toNumF64(min, emit(min)))
650
+ const t = emitDateLoad(dateExpr)
651
+ const s = missingArg(sec)
652
+ ? (inc('__date_sec_from_time'), typed(['call', '$__date_sec_from_time', t], 'f64'))
653
+ : asF64(toNumF64(sec, emit(sec)))
654
+ const msec = missingArg(ms)
655
+ ? (inc('__date_ms_from_time'), typed(['call', '$__date_ms_from_time', t], 'f64'))
656
+ : asF64(toNumF64(ms, emit(ms)))
657
+ return typed(['call', '$__date_set_utc_minutes', emitDatePtr(dateExpr), t, m, s, msec], 'f64')
658
+ }
659
+ ctx.core.emit[`.${VAL.DATE}:setUTCMinutes`] = ctx.core.emit['.setUTCMinutes']
660
+
661
+ ctx.core.emit['.setUTCSeconds'] = (dateExpr, sec, ms) => {
662
+ inc('__date_set_utc_seconds')
663
+ const s = asF64(toNumF64(sec, emit(sec)))
664
+ const t = emitDateLoad(dateExpr)
665
+ const msec = missingArg(ms)
666
+ ? (inc('__date_ms_from_time'), typed(['call', '$__date_ms_from_time', t], 'f64'))
667
+ : asF64(toNumF64(ms, emit(ms)))
668
+ return typed(['call', '$__date_set_utc_seconds', emitDatePtr(dateExpr), t, s, msec], 'f64')
669
+ }
670
+ ctx.core.emit[`.${VAL.DATE}:setUTCSeconds`] = ctx.core.emit['.setUTCSeconds']
671
+
672
+ ctx.core.emit['.setUTCMilliseconds'] = (dateExpr, ms) => {
673
+ inc('__date_set_utc_milliseconds')
674
+ return typed(['call', '$__date_set_utc_milliseconds', emitDatePtr(dateExpr), emitDateLoad(dateExpr), asF64(toNumF64(ms, emit(ms)))], 'f64')
675
+ }
676
+ ctx.core.emit[`.${VAL.DATE}:setUTCMilliseconds`] = ctx.core.emit['.setUTCMilliseconds']
677
+
678
+ // ── Stringification ───────────────────────────────────────────────────────
679
+
680
+ ctx.core.emit['.toISOString'] = (dateExpr) => {
681
+ inc('__date_to_iso_string')
682
+ return typed(['call', '$__date_to_iso_string', emitDateLoad(dateExpr)], 'f64')
683
+ }
684
+ ctx.core.emit[`.${VAL.DATE}:toISOString`] = ctx.core.emit['.toISOString']
685
+
686
+ ctx.core.emit['.toUTCString'] = (dateExpr) => {
687
+ inc('__date_to_utc_string')
688
+ return typed(['call', '$__date_to_utc_string', emitDateLoad(dateExpr)], 'f64')
689
+ }
690
+ ctx.core.emit[`.${VAL.DATE}:toUTCString`] = ctx.core.emit['.toUTCString']
691
+ }