Skip to content

Commit 579b0f4

Browse files
feat: removed the need use JS for the Date.UTC function
1 parent 66dff3c commit 579b0f4

File tree

4 files changed

+388
-400
lines changed

4 files changed

+388
-400
lines changed

std/assembly/bindings/Date.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1 @@
1-
export declare function UTC(
2-
// NOTE: Using i32 below saves us a f64.convert_s instruction and moves the responsibility for
3-
// converting the value to the WASM/JS boundary.
4-
year: i32,
5-
month: i32,
6-
day: i32,
7-
hour: i32,
8-
minute: i32,
9-
second: i32,
10-
millisecond: f64
11-
): f64;
121
export declare function now(): f64;

std/assembly/date.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { E_VALUEOUTOFRANGE } from "util/error";
2-
import { UTC as Date_UTC, now as Date_now } from "./bindings/Date";
2+
import { now as Date_now } from "./bindings/Date";
33

44
export class Date {
55
@inline static UTC(
@@ -9,11 +9,9 @@ export class Date {
99
hour: i32 = 0,
1010
minute: i32 = 0,
1111
second: i32 = 0,
12-
millisecond: i64 = 0
12+
millisecond: i32 = 0
1313
): i64 {
14-
return <i64>(
15-
Date_UTC(year, month, day, hour, minute, second, <f64>millisecond)
16-
);
14+
return epochMillis(year, month + 1, day, hour, minute, second, millisecond);
1715
}
1816

1917
@inline static now(): i64 {

tests/compiler/std/date.optimized.wat

Lines changed: 100 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
(type $none_=>_i32 (func (result i32)))
1111
(type $i64_=>_i32 (func (param i64) (result i32)))
1212
(type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32)))
13-
(type $i32_i32_i32_i32_i32_i32_f64_=>_f64 (func (param i32 i32 i32 i32 i32 i32 f64) (result f64)))
14-
(import "Date" "UTC" (func $~lib/bindings/Date/UTC (param i32 i32 i32 i32 i32 i32 f64) (result f64)))
13+
(type $i32_i32_i32_i32_i32_i32_i32_=>_i64 (func (param i32 i32 i32 i32 i32 i32 i32) (result i64)))
1514
(import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32)))
1615
(memory $0 1)
1716
(data (i32.const 1036) ",")
@@ -100,6 +99,90 @@
10099
(global $~started (mut i32) (i32.const 0))
101100
(export "memory" (memory $0))
102101
(export "_start" (func $~start))
102+
(func $~lib/date/daysSinceEpoch (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
103+
(local $3 i32)
104+
local.get $0
105+
local.get $1
106+
i32.const 2
107+
i32.le_s
108+
i32.sub
109+
local.tee $0
110+
local.get $0
111+
i32.const 399
112+
i32.sub
113+
local.get $0
114+
i32.const 0
115+
i32.ge_s
116+
select
117+
i32.const 400
118+
i32.div_s
119+
local.tee $3
120+
i32.const 146097
121+
i32.mul
122+
local.get $2
123+
local.get $1
124+
i32.const -3
125+
i32.const 9
126+
local.get $1
127+
i32.const 2
128+
i32.gt_s
129+
select
130+
i32.add
131+
i32.const 153
132+
i32.mul
133+
i32.const 2
134+
i32.add
135+
i32.const 5
136+
i32.div_s
137+
i32.add
138+
local.get $0
139+
local.get $3
140+
i32.const 400
141+
i32.mul
142+
i32.sub
143+
local.tee $0
144+
i32.const 365
145+
i32.mul
146+
local.get $0
147+
i32.const 4
148+
i32.div_s
149+
i32.add
150+
local.get $0
151+
i32.const 100
152+
i32.div_s
153+
i32.sub
154+
i32.add
155+
i32.add
156+
i32.const 719469
157+
i32.sub
158+
)
159+
(func $~lib/date/epochMillis (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (param $5 i32) (param $6 i32) (result i64)
160+
local.get $6
161+
i64.extend_i32_s
162+
local.get $5
163+
i32.const 1000
164+
i32.mul
165+
i64.extend_i32_s
166+
local.get $4
167+
i32.const 60000
168+
i32.mul
169+
i64.extend_i32_s
170+
local.get $3
171+
i32.const 3600000
172+
i32.mul
173+
i64.extend_i32_s
174+
local.get $0
175+
local.get $1
176+
local.get $2
177+
call $~lib/date/daysSinceEpoch
178+
i64.extend_i32_s
179+
i64.const 86400000
180+
i64.mul
181+
i64.add
182+
i64.add
183+
i64.add
184+
i64.add
185+
)
103186
(func $~lib/rt/itcms/initLazy (param $0 i32) (result i32)
104187
local.get $0
105188
local.get $0
@@ -1877,7 +1960,7 @@
18771960
if
18781961
i32.const 1504
18791962
i32.const 1568
1880-
i32.const 195
1963+
i32.const 193
18811964
i32.const 39
18821965
call $~lib/builtins/abort
18831966
unreachable
@@ -2176,63 +2259,6 @@
21762259
end
21772260
end
21782261
)
2179-
(func $~lib/date/daysSinceEpoch (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
2180-
(local $3 i32)
2181-
local.get $0
2182-
local.get $1
2183-
i32.const 2
2184-
i32.le_s
2185-
i32.sub
2186-
local.tee $0
2187-
local.get $0
2188-
i32.const 399
2189-
i32.sub
2190-
local.get $0
2191-
i32.const 0
2192-
i32.ge_s
2193-
select
2194-
i32.const 400
2195-
i32.div_s
2196-
local.tee $3
2197-
i32.const 146097
2198-
i32.mul
2199-
local.get $2
2200-
local.get $1
2201-
i32.const -3
2202-
i32.const 9
2203-
local.get $1
2204-
i32.const 2
2205-
i32.gt_s
2206-
select
2207-
i32.add
2208-
i32.const 153
2209-
i32.mul
2210-
i32.const 2
2211-
i32.add
2212-
i32.const 5
2213-
i32.div_s
2214-
i32.add
2215-
local.get $0
2216-
local.get $3
2217-
i32.const 400
2218-
i32.mul
2219-
i32.sub
2220-
local.tee $0
2221-
i32.const 365
2222-
i32.mul
2223-
local.get $0
2224-
i32.const 4
2225-
i32.div_s
2226-
i32.add
2227-
local.get $0
2228-
i32.const 100
2229-
i32.div_s
2230-
i32.sub
2231-
i32.add
2232-
i32.add
2233-
i32.const 719469
2234-
i32.sub
2235-
)
22362262
(func $~lib/date/Date#setUTCDate (param $0 i32) (param $1 i32)
22372263
(local $2 i32)
22382264
(local $3 i32)
@@ -4099,7 +4125,6 @@
40994125
i32.store offset=16
41004126
local.get $1
41014127
call $~lib/util/string/strtol<i32>
4102-
local.set $6
41034128
local.get $0
41044129
i32.const 1
41054130
call $~lib/array/Array<~lib/string/String>#__get
@@ -4109,40 +4134,20 @@
41094134
i32.store offset=16
41104135
local.get $1
41114136
call $~lib/util/string/strtol<i32>
4112-
local.set $1
41134137
local.get $0
41144138
i32.const 2
41154139
call $~lib/array/Array<~lib/string/String>#__get
41164140
local.set $0
41174141
global.get $~lib/memory/__stack_pointer
41184142
local.get $0
41194143
i32.store offset=16
4120-
local.get $5
4121-
i64.extend_i32_s
4122-
local.get $2
4123-
i32.const 1000
4124-
i32.mul
4125-
i64.extend_i32_s
4126-
local.get $4
4127-
i32.const 60000
4128-
i32.mul
4129-
i64.extend_i32_s
4130-
local.get $3
4131-
i32.const 3600000
4132-
i32.mul
4133-
i64.extend_i32_s
4134-
local.get $6
4135-
local.get $1
41364144
local.get $0
41374145
call $~lib/util/string/strtol<i32>
4138-
call $~lib/date/daysSinceEpoch
4139-
i64.extend_i32_s
4140-
i64.const 86400000
4141-
i64.mul
4142-
i64.add
4143-
i64.add
4144-
i64.add
4145-
i64.add
4146+
local.get $3
4147+
local.get $4
4148+
local.get $2
4149+
local.get $5
4150+
call $~lib/date/epochMillis
41464151
call $~lib/date/Date#constructor
41474152
global.get $~lib/memory/__stack_pointer
41484153
i32.const 32
@@ -4164,14 +4169,13 @@
41644169
i32.const 0
41654170
i32.store offset=8
41664171
i32.const 1970
4167-
i32.const 0
41684172
i32.const 1
4173+
i32.const 1
4174+
i32.const 0
41694175
i32.const 0
41704176
i32.const 0
41714177
i32.const 0
4172-
f64.const 0
4173-
call $~lib/bindings/Date/UTC
4174-
i64.trunc_f64_s
4178+
call $~lib/date/epochMillis
41754179
i64.eqz
41764180
i32.eqz
41774181
if
@@ -4183,14 +4187,13 @@
41834187
unreachable
41844188
end
41854189
i32.const 1970
4186-
i32.const 0
41874190
i32.const 1
4191+
i32.const 1
4192+
i32.const 0
41884193
i32.const 0
41894194
i32.const 0
41904195
i32.const 0
4191-
f64.const 0
4192-
call $~lib/bindings/Date/UTC
4193-
i64.trunc_f64_s
4196+
call $~lib/date/epochMillis
41944197
i64.eqz
41954198
i32.eqz
41964199
if
@@ -4202,14 +4205,13 @@
42024205
unreachable
42034206
end
42044207
i32.const 2018
4205-
i32.const 10
4208+
i32.const 11
42064209
i32.const 10
42074210
i32.const 11
42084211
i32.const 0
42094212
i32.const 0
4210-
f64.const 1
4211-
call $~lib/bindings/Date/UTC
4212-
i64.trunc_f64_s
4213+
i32.const 1
4214+
call $~lib/date/epochMillis
42134215
i64.const 1541847600001
42144216
i64.ne
42154217
if

0 commit comments

Comments
 (0)