Skip to content

Commit ca53334

Browse files
devsnekljharb
authored andcommitted
Normative: Fix out-of-range NaNs in date set methods (#2136)
1 parent 15a7d8a commit ca53334

File tree

1 file changed

+54
-30
lines changed

1 file changed

+54
-30
lines changed

spec.html

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32616,8 +32616,10 @@ <h1>Date.prototype.getUTCSeconds ( )</h1>
3261632616
<h1>Date.prototype.setDate ( _date_ )</h1>
3261732617
<p>The following steps are performed:</p>
3261832618
<emu-alg>
32619-
1. Let _t_ be LocalTime(? thisTimeValue(*this* value)).
32619+
1. Let _t_ be ? thisTimeValue(*this* value).
3262032620
1. Let _dt_ be ? ToNumber(_date_).
32621+
1. If _t_ is *NaN*, return *NaN*.
32622+
1. Set _t_ to LocalTime(_t_).
3262132623
1. Let _newDate_ be MakeDate(MakeDay(YearFromTime(_t_), MonthFromTime(_t_), _dt_), TimeWithinDay(_t_)).
3262232624
1. Let _u_ be TimeClip(UTC(_newDate_)).
3262332625
1. Set the [[DateValue]] internal slot of this Date object to _u_.
@@ -32630,8 +32632,8 @@ <h1>Date.prototype.setFullYear ( _year_ [ , _month_ [ , _date_ ] ] )</h1>
3263032632
<p>The following steps are performed:</p>
3263132633
<emu-alg>
3263232634
1. Let _t_ be ? thisTimeValue(*this* value).
32633-
1. If _t_ is *NaN*, set _t_ to *+0*<sub>𝔽</sub>; otherwise, set _t_ to LocalTime(_t_).
3263432635
1. Let _y_ be ? ToNumber(_year_).
32636+
1. If _t_ is *NaN*, set _t_ to *+0*<sub>𝔽</sub>; otherwise, set _t_ to LocalTime(_t_).
3263532637
1. If _month_ is not present, let _m_ be MonthFromTime(_t_); otherwise, let _m_ be ? ToNumber(_month_).
3263632638
1. If _date_ is not present, let _dt_ be DateFromTime(_t_); otherwise, let _dt_ be ? ToNumber(_date_).
3263732639
1. Let _newDate_ be MakeDate(MakeDay(_y_, _m_, _dt_), TimeWithinDay(_t_)).
@@ -32649,11 +32651,16 @@ <h1>Date.prototype.setFullYear ( _year_ [ , _month_ [ , _date_ ] ] )</h1>
3264932651
<h1>Date.prototype.setHours ( _hour_ [ , _min_ [ , _sec_ [ , _ms_ ] ] ] )</h1>
3265032652
<p>The following steps are performed:</p>
3265132653
<emu-alg>
32652-
1. Let _t_ be LocalTime(? thisTimeValue(*this* value)).
32654+
1. Let _t_ be ? thisTimeValue(*this* value).
3265332655
1. Let _h_ be ? ToNumber(_hour_).
32654-
1. If _min_ is not present, let _m_ be MinFromTime(_t_); otherwise, let _m_ be ? ToNumber(_min_).
32655-
1. If _sec_ is not present, let _s_ be SecFromTime(_t_); otherwise, let _s_ be ? ToNumber(_sec_).
32656-
1. If _ms_ is not present, let _milli_ be msFromTime(_t_); otherwise, let _milli_ be ? ToNumber(_ms_).
32656+
1. If _min_ is present, let _m_ be ? ToNumber(_min_).
32657+
1. If _sec_ is present, let _s_ be ? ToNumber(_sec_).
32658+
1. If _ms_ is present, let _milli_ be ? ToNumber(_ms_).
32659+
1. If _t_ is *NaN*, return *NaN*.
32660+
1. Set _t_ to LocalTime(_t_).
32661+
1. If _min_ is not present, let _m_ be MinFromTime(_t_).
32662+
1. If _sec_ is not present, let _s_ be SecFromTime(_t_).
32663+
1. If _ms_ is not present, let _milli_ be msFromTime(_t_).
3265732664
1. Let _date_ be MakeDate(Day(_t_), MakeTime(_h_, _m_, _s_, _milli_)).
3265832665
1. Let _u_ be TimeClip(UTC(_date_)).
3265932666
1. Set the [[DateValue]] internal slot of this Date object to _u_.
@@ -32669,8 +32676,10 @@ <h1>Date.prototype.setHours ( _hour_ [ , _min_ [ , _sec_ [ , _ms_ ] ] ] )</h1>
3266932676
<h1>Date.prototype.setMilliseconds ( _ms_ )</h1>
3267032677
<p>The following steps are performed:</p>
3267132678
<emu-alg>
32672-
1. Let _t_ be LocalTime(? thisTimeValue(*this* value)).
32679+
1. Let _t_ be ? thisTimeValue(*this* value).
3267332680
1. Set _ms_ to ? ToNumber(_ms_).
32681+
1. If _t_ is *NaN*, return *NaN*.
32682+
1. Set _t_ to LocalTime(_t_).
3267432683
1. Let _time_ be MakeTime(HourFromTime(_t_), MinFromTime(_t_), SecFromTime(_t_), _ms_).
3267532684
1. Let _u_ be TimeClip(UTC(MakeDate(Day(_t_), _time_))).
3267632685
1. Set the [[DateValue]] internal slot of this Date object to _u_.
@@ -32682,10 +32691,14 @@ <h1>Date.prototype.setMilliseconds ( _ms_ )</h1>
3268232691
<h1>Date.prototype.setMinutes ( _min_ [ , _sec_ [ , _ms_ ] ] )</h1>
3268332692
<p>The following steps are performed:</p>
3268432693
<emu-alg>
32685-
1. Let _t_ be LocalTime(? thisTimeValue(*this* value)).
32694+
1. Let _t_ be ? thisTimeValue(*this* value).
3268632695
1. Let _m_ be ? ToNumber(_min_).
32687-
1. If _sec_ is not present, let _s_ be SecFromTime(_t_); otherwise, let _s_ be ? ToNumber(_sec_).
32688-
1. If _ms_ is not present, let _milli_ be msFromTime(_t_); otherwise, let _milli_ be ? ToNumber(_ms_).
32696+
1. If _sec_ is present, let _s_ be ? ToNumber(_sec_).
32697+
1. If _ms_ is present, let _milli_ be ? ToNumber(_ms_).
32698+
1. If _t_ is *NaN*, return *NaN*.
32699+
1. Set _t_ to LocalTime(_t_).
32700+
1. If _sec_ is not present, let _s_ be SecFromTime(_t_).
32701+
1. If _ms_ is not present, let _milli_ be msFromTime(_t_).
3268932702
1. Let _date_ be MakeDate(Day(_t_), MakeTime(HourFromTime(_t_), _m_, _s_, _milli_)).
3269032703
1. Let _u_ be TimeClip(UTC(_date_)).
3269132704
1. Set the [[DateValue]] internal slot of this Date object to _u_.
@@ -32701,9 +32714,12 @@ <h1>Date.prototype.setMinutes ( _min_ [ , _sec_ [ , _ms_ ] ] )</h1>
3270132714
<h1>Date.prototype.setMonth ( _month_ [ , _date_ ] )</h1>
3270232715
<p>The following steps are performed:</p>
3270332716
<emu-alg>
32704-
1. Let _t_ be LocalTime(? thisTimeValue(*this* value)).
32717+
1. Let _t_ be ? thisTimeValue(*this* value).
3270532718
1. Let _m_ be ? ToNumber(_month_).
32706-
1. If _date_ is not present, let _dt_ be DateFromTime(_t_); otherwise, let _dt_ be ? ToNumber(_date_).
32719+
1. If _date_ is present, let _dt_ be ? ToNumber(_date_).
32720+
1. If _t_ is *NaN*, return *NaN*.
32721+
1. Set _t_ to LocalTime(_t_).
32722+
1. If _date_ is not present, let _dt_ be DateFromTime(_t_).
3270732723
1. Let _newDate_ be MakeDate(MakeDay(YearFromTime(_t_), _m_, _dt_), TimeWithinDay(_t_)).
3270832724
1. Let _u_ be TimeClip(UTC(_newDate_)).
3270932725
1. Set the [[DateValue]] internal slot of this Date object to _u_.
@@ -32719,9 +32735,12 @@ <h1>Date.prototype.setMonth ( _month_ [ , _date_ ] )</h1>
3271932735
<h1>Date.prototype.setSeconds ( _sec_ [ , _ms_ ] )</h1>
3272032736
<p>The following steps are performed:</p>
3272132737
<emu-alg>
32722-
1. Let _t_ be LocalTime(? thisTimeValue(*this* value)).
32738+
1. Let _t_ be ? thisTimeValue(*this* value).
3272332739
1. Let _s_ be ? ToNumber(_sec_).
32724-
1. If _ms_ is not present, let _milli_ be msFromTime(_t_); otherwise, let _milli_ be ? ToNumber(_ms_).
32740+
1. If _ms_ is present, let _milli_ be ? ToNumber(_ms_).
32741+
1. If _t_ is *NaN*, return *NaN*.
32742+
1. Set _t_ to LocalTime(_t_).
32743+
1. If _ms_ is not present, let _milli_ be msFromTime(_t_).
3272532744
1. Let _date_ be MakeDate(Day(_t_), MakeTime(HourFromTime(_t_), MinFromTime(_t_), _s_, _milli_)).
3272632745
1. Let _u_ be TimeClip(UTC(_date_)).
3272732746
1. Set the [[DateValue]] internal slot of this Date object to _u_.
@@ -32751,6 +32770,7 @@ <h1>Date.prototype.setUTCDate ( _date_ )</h1>
3275132770
<emu-alg>
3275232771
1. Let _t_ be ? thisTimeValue(*this* value).
3275332772
1. Let _dt_ be ? ToNumber(_date_).
32773+
1. If _t_ is *NaN*, return *NaN*.
3275432774
1. Let _newDate_ be MakeDate(MakeDay(YearFromTime(_t_), MonthFromTime(_t_), _dt_), TimeWithinDay(_t_)).
3275532775
1. Let _v_ be TimeClip(_newDate_).
3275632776
1. Set the [[DateValue]] internal slot of this Date object to _v_.
@@ -32784,11 +32804,15 @@ <h1>Date.prototype.setUTCHours ( _hour_ [ , _min_ [ , _sec_ [ , _ms_ ] ] ] )</h1
3278432804
<emu-alg>
3278532805
1. Let _t_ be ? thisTimeValue(*this* value).
3278632806
1. Let _h_ be ? ToNumber(_hour_).
32787-
1. If _min_ is not present, let _m_ be MinFromTime(_t_); otherwise, let _m_ be ? ToNumber(_min_).
32788-
1. If _sec_ is not present, let _s_ be SecFromTime(_t_); otherwise, let _s_ be ? ToNumber(_sec_).
32789-
1. If _ms_ is not present, let _milli_ be msFromTime(_t_); otherwise, let _milli_ be ? ToNumber(_ms_).
32790-
1. Let _newDate_ be MakeDate(Day(_t_), MakeTime(_h_, _m_, _s_, _milli_)).
32791-
1. Let _v_ be TimeClip(_newDate_).
32807+
1. If _min_ is present, let _m_ be ? ToNumber(_min_).
32808+
1. If _sec_ is present, let _s_ be ? ToNumber(_sec_).
32809+
1. If _ms_ is present, let _milli_ be ? ToNumber(_ms_).
32810+
1. If _t_ is *NaN*, return *NaN*.
32811+
1. If _min_ is not present, let _m_ be MinFromTime(_t_).
32812+
1. If _sec_ is not present, let _s_ be SecFromTime(_t_).
32813+
1. If _ms_ is not present, let _milli_ be msFromTime(_t_).
32814+
1. Let _date_ be MakeDate(Day(_t_), MakeTime(_h_, _m_, _s_, _milli_)).
32815+
1. Let _v_ be TimeClip(_date_).
3279232816
1. Set the [[DateValue]] internal slot of this Date object to _v_.
3279332817
1. Return _v_.
3279432818
</emu-alg>
@@ -32803,8 +32827,9 @@ <h1>Date.prototype.setUTCMilliseconds ( _ms_ )</h1>
3280332827
<p>The following steps are performed:</p>
3280432828
<emu-alg>
3280532829
1. Let _t_ be ? thisTimeValue(*this* value).
32806-
1. Let _milli_ be ? ToNumber(_ms_).
32807-
1. Let _time_ be MakeTime(HourFromTime(_t_), MinFromTime(_t_), SecFromTime(_t_), _milli_).
32830+
1. Set _ms_ to ? ToNumber(_ms_).
32831+
1. If _t_ is *NaN*, return *NaN*.
32832+
1. Let _time_ be MakeTime(HourFromTime(_t_), MinFromTime(_t_), SecFromTime(_t_), _ms_).
3280832833
1. Let _v_ be TimeClip(MakeDate(Day(_t_), _time_)).
3280932834
1. Set the [[DateValue]] internal slot of this Date object to _v_.
3281032835
1. Return _v_.
@@ -32817,12 +32842,11 @@ <h1>Date.prototype.setUTCMinutes ( _min_ [ , _sec_ [ , _ms_ ] ] )</h1>
3281732842
<emu-alg>
3281832843
1. Let _t_ be ? thisTimeValue(*this* value).
3281932844
1. Let _m_ be ? ToNumber(_min_).
32845+
1. If _sec_ is present, let _s_ be ? ToNumber(_sec_).
32846+
1. If _ms_ is present, let _milli_ be ? ToNumber(_ms_).
32847+
1. If _t_ is *NaN*, return *NaN*.
3282032848
1. If _sec_ is not present, let _s_ be SecFromTime(_t_).
32821-
1. Else,
32822-
1. Let _s_ be ? ToNumber(_sec_).
3282332849
1. If _ms_ is not present, let _milli_ be msFromTime(_t_).
32824-
1. Else,
32825-
1. Let _milli_ be ? ToNumber(_ms_).
3282632850
1. Let _date_ be MakeDate(Day(_t_), MakeTime(HourFromTime(_t_), _m_, _s_, _milli_)).
3282732851
1. Let _v_ be TimeClip(_date_).
3282832852
1. Set the [[DateValue]] internal slot of this Date object to _v_.
@@ -32840,9 +32864,9 @@ <h1>Date.prototype.setUTCMonth ( _month_ [ , _date_ ] )</h1>
3284032864
<emu-alg>
3284132865
1. Let _t_ be ? thisTimeValue(*this* value).
3284232866
1. Let _m_ be ? ToNumber(_month_).
32867+
1. If _date_ is present, let _dt_ be ? ToNumber(_date_).
32868+
1. If _t_ is *NaN*, return *NaN*.
3284332869
1. If _date_ is not present, let _dt_ be DateFromTime(_t_).
32844-
1. Else,
32845-
1. Let _dt_ be ? ToNumber(_date_).
3284632870
1. Let _newDate_ be MakeDate(MakeDay(YearFromTime(_t_), _m_, _dt_), TimeWithinDay(_t_)).
3284732871
1. Let _v_ be TimeClip(_newDate_).
3284832872
1. Set the [[DateValue]] internal slot of this Date object to _v_.
@@ -32860,9 +32884,9 @@ <h1>Date.prototype.setUTCSeconds ( _sec_ [ , _ms_ ] )</h1>
3286032884
<emu-alg>
3286132885
1. Let _t_ be ? thisTimeValue(*this* value).
3286232886
1. Let _s_ be ? ToNumber(_sec_).
32887+
1. If _ms_ is present, let _milli_ be ? ToNumber(_ms_).
32888+
1. If _t_ is *NaN*, return *NaN*.
3286332889
1. If _ms_ is not present, let _milli_ be msFromTime(_t_).
32864-
1. Else,
32865-
1. Let _milli_ be ? ToNumber(_ms_).
3286632890
1. Let _date_ be MakeDate(Day(_t_), MakeTime(HourFromTime(_t_), MinFromTime(_t_), _s_, _milli_)).
3286732891
1. Let _v_ be TimeClip(_date_).
3286832892
1. Set the [[DateValue]] internal slot of this Date object to _v_.
@@ -47125,8 +47149,8 @@ <h1>Date.prototype.setYear ( _year_ )</h1>
4712547149
<p>When the `setYear` method is called with one argument _year_, the following steps are taken:</p>
4712647150
<emu-alg>
4712747151
1. Let _t_ be ? thisTimeValue(*this* value).
47128-
1. If _t_ is *NaN*, set _t_ to *+0*<sub>𝔽</sub>; otherwise, set _t_ to LocalTime(_t_).
4712947152
1. Let _y_ be ? ToNumber(_year_).
47153+
1. If _t_ is *NaN*, set _t_ to *+0*<sub>𝔽</sub>; otherwise, set _t_ to LocalTime(_t_).
4713047154
1. If _y_ is *NaN*, then
4713147155
1. Set the [[DateValue]] internal slot of this Date object to *NaN*.
4713247156
1. Return *NaN*.

0 commit comments

Comments
 (0)