mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 20:07:36 +00:00
LibJS: Add spec comments to Value::to_number()
This commit is contained in:
parent
9a406ccba6
commit
b97cdfc36c
1 changed files with 24 additions and 10 deletions
|
@ -661,25 +661,39 @@ Optional<Value> string_to_number(StringView string)
|
||||||
ThrowCompletionOr<Value> Value::to_number(VM& vm) const
|
ThrowCompletionOr<Value> Value::to_number(VM& vm) const
|
||||||
{
|
{
|
||||||
VERIFY(!is_empty());
|
VERIFY(!is_empty());
|
||||||
|
|
||||||
|
// 1. If argument is a Number, return argument.
|
||||||
if (is_number())
|
if (is_number())
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
switch (m_value.tag) {
|
switch (m_value.tag) {
|
||||||
case UNDEFINED_TAG:
|
// 2. If argument is either a Symbol or a BigInt, throw a TypeError exception.
|
||||||
return js_nan();
|
|
||||||
case NULL_TAG:
|
|
||||||
return Value(0);
|
|
||||||
case BOOLEAN_TAG:
|
|
||||||
return Value(as_bool() ? 1 : 0);
|
|
||||||
case STRING_TAG:
|
|
||||||
return string_to_number(as_string().deprecated_string().view());
|
|
||||||
case SYMBOL_TAG:
|
case SYMBOL_TAG:
|
||||||
return vm.throw_completion<TypeError>(ErrorType::Convert, "symbol", "number");
|
return vm.throw_completion<TypeError>(ErrorType::Convert, "symbol", "number");
|
||||||
case BIGINT_TAG:
|
case BIGINT_TAG:
|
||||||
return vm.throw_completion<TypeError>(ErrorType::Convert, "BigInt", "number");
|
return vm.throw_completion<TypeError>(ErrorType::Convert, "BigInt", "number");
|
||||||
|
// 3. If argument is undefined, return NaN.
|
||||||
|
case UNDEFINED_TAG:
|
||||||
|
return js_nan();
|
||||||
|
// 4. If argument is either null or false, return +0𝔽.
|
||||||
|
case NULL_TAG:
|
||||||
|
return Value(0);
|
||||||
|
// 5. If argument is true, return 1𝔽.
|
||||||
|
case BOOLEAN_TAG:
|
||||||
|
return Value(as_bool() ? 1 : 0);
|
||||||
|
// 6. If argument is a String, return StringToNumber(argument).
|
||||||
|
case STRING_TAG:
|
||||||
|
return string_to_number(as_string().deprecated_string().view());
|
||||||
|
// 7. Assert: argument is an Object.
|
||||||
case OBJECT_TAG: {
|
case OBJECT_TAG: {
|
||||||
auto primitive = TRY(to_primitive(vm, PreferredType::Number));
|
// 8. Let primValue be ? ToPrimitive(argument, number).
|
||||||
return primitive.to_number(vm);
|
auto primitive_value = TRY(to_primitive(vm, PreferredType::Number));
|
||||||
|
|
||||||
|
// 9. Assert: primValue is not an Object.
|
||||||
|
VERIFY(!primitive_value.is_object());
|
||||||
|
|
||||||
|
// 10. Return ? ToNumber(primValue).
|
||||||
|
return primitive_value.to_number(vm);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue