Skip to content

Commit 4f89806

Browse files
authored
feat(ecmascript): Atomics.store (#884)
1 parent 6cfa1c5 commit 4f89806

File tree

5 files changed

+354
-175
lines changed

5 files changed

+354
-175
lines changed

β€Žnova_vm/src/ecmascript/abstract_operations/type_conversion.rsβ€Ž

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
600669
pub(crate) fn to_int32<'a>(
601670
agent: &mut Agent,

0 commit comments

Comments
Β (0)