@@ -596,6 +596,75 @@ pub(crate) fn try_to_integer_or_infinity<'a>(
596596 TryResult :: Continue ( to_integer_or_infinity_number ( agent, number) )
597597}
598598
599+ /// ### [7.1.5 ToIntegerOrInfinity ( argument )](https://tc39.es/ecma262/#sec-tointegerorinfinity)
600+ pub ( crate ) fn to_integer_number_or_infinity < ' a > (
601+ agent : & mut Agent ,
602+ argument : Value ,
603+ mut gc : GcScope < ' a , ' _ > ,
604+ ) -> JsResult < ' a , Number < ' a > > {
605+ // Fast path: A safe integer is already an integer.
606+ if let Value :: Integer ( int) = argument {
607+ return Ok ( Number :: Integer ( int) ) ;
608+ }
609+ // 1. Let number be ? ToNumber(argument).
610+ let number = to_number ( agent, argument, gc. reborrow ( ) ) . unbind ( ) ?;
611+ let gc = gc. into_nogc ( ) ;
612+ let number = number. bind ( gc) ;
613+
614+ // Fast path: The value might've been eg. parsed into an integer.
615+ if let Number :: Integer ( int) = number {
616+ return Ok ( Number :: Integer ( int) ) ;
617+ }
618+
619+ // 2. If number is one of NaN, +0π½, or -0π½, return 0.
620+ if number. is_nan ( agent) || number. is_pos_zero ( agent) || number. is_neg_zero ( agent) {
621+ return Ok ( Number :: from ( 0 ) ) ;
622+ }
623+
624+ // 3. If number is +βπ½, return +β.
625+ if number. is_pos_infinity ( agent) {
626+ return Ok ( Number :: pos_inf ( ) ) ;
627+ }
628+
629+ // 4. If number is -βπ½, return -β.
630+ if number. is_neg_infinity ( agent) {
631+ return Ok ( Number :: neg_inf ( ) ) ;
632+ }
633+
634+ // 5. Return truncate(β(number)).
635+ Ok ( number. unbind ( ) . truncate ( agent, gc) )
636+ }
637+
638+ /// ### [7.1.5 ToIntegerOrInfinity ( argument )](https://tc39.es/ecma262/#sec-tointegerorinfinity)
639+ pub ( crate ) fn number_convert_to_integer_or_infinity < ' a > (
640+ agent : & mut Agent ,
641+ number : Number < ' a > ,
642+ gc : NoGcScope < ' a , ' _ > ,
643+ ) -> Number < ' a > {
644+ // Fast path: A safe integer is already an integer.
645+ if let Number :: Integer ( int) = number {
646+ return Number :: Integer ( int) ;
647+ }
648+
649+ // 2. If number is one of NaN, +0π½, or -0π½, return 0.
650+ if number. is_nan ( agent) || number. is_pos_zero ( agent) || number. is_neg_zero ( agent) {
651+ return Number :: from ( 0 ) ;
652+ }
653+
654+ // 3. If number is +βπ½, return +β.
655+ if number. is_pos_infinity ( agent) {
656+ return Number :: pos_inf ( ) ;
657+ }
658+
659+ // 4. If number is -βπ½, return -β.
660+ if number. is_neg_infinity ( agent) {
661+ return Number :: neg_inf ( ) ;
662+ }
663+
664+ // 5. Return truncate(β(number)).
665+ number. unbind ( ) . truncate ( agent, gc)
666+ }
667+
599668/// ### [7.1.6 ToInt32 ( argument )](https://tc39.es/ecma262/#sec-toint32)
600669pub ( crate ) fn to_int32 < ' a > (
601670 agent : & mut Agent ,
0 commit comments