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/README.md +257 -90
- package/cli.js +34 -8
- package/index.js +102 -13
- package/module/array.js +396 -133
- package/module/collection.js +455 -212
- package/module/console.js +169 -88
- package/module/core.js +246 -144
- package/module/date.js +691 -0
- package/module/function.js +81 -21
- package/module/index.js +2 -1
- package/module/json.js +483 -138
- package/module/math.js +79 -39
- package/module/number.js +188 -78
- package/module/object.js +227 -47
- package/module/regex.js +33 -30
- package/module/schema.js +14 -17
- package/module/string.js +434 -235
- package/module/symbol.js +4 -3
- package/module/timer.js +89 -31
- package/module/typedarray.js +174 -44
- package/package.json +3 -10
- package/src/analyze.js +626 -132
- package/src/autoload.js +14 -6
- package/src/compile.js +399 -70
- package/src/ctx.js +41 -12
- package/src/emit.js +634 -145
- package/src/host.js +244 -51
- package/src/ir.js +81 -31
- package/src/jzify.js +181 -24
- package/src/narrow.js +32 -4
- package/src/optimize.js +628 -42
- package/src/plan.js +1132 -4
- package/src/prepare.js +321 -75
- package/src/vectorize.js +1016 -0
- package/wasi.js +13 -0
- package/src/key.js +0 -73
- package/src/source.js +0 -76
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
|
+
}
|