From da0ab16f011bec0c4da862db80dc53c2122e04f2 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Tue, 28 Apr 2020 23:58:23 +0100 Subject: [PATCH] LibJS: Don't handle arrays separately in Value::to_number() Now that Array.prototype.join() is producing the correct results we can remove the separate code path for arrays in Value::to_number() and treat them like all other objects - using to_primitive() with number as the preferred type and then calling to_number() on the result. This is how the spec descibes it. This also means we don't crash anymore when trying to coerce [] to a number - it now does the following: [] - to string - "" - to number - 0 [, ] - to string - "," - to number - NaN --- Libraries/LibJS/Runtime/Value.cpp | 11 +---------- Libraries/LibJS/Tests/to-number-basic.js | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index e2457d5ce4..d0998e4ec1 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -162,16 +162,7 @@ Value Value::to_number() const case Type::Undefined: return js_nan(); case Type::Object: - if (m_value.as_object->is_array()) { - auto& array = *static_cast(m_value.as_object); - if (array.length() == 0) - return Value(0); - if (array.length() > 1) - return js_nan(); - return array.elements()[0].to_number(); - } else { - return m_value.as_object->to_primitive(Object::PreferredType::Number).to_number(); - } + return m_value.as_object->to_primitive(Object::PreferredType::Number).to_number(); } ASSERT_NOT_REACHED(); diff --git a/Libraries/LibJS/Tests/to-number-basic.js b/Libraries/LibJS/Tests/to-number-basic.js index e0d07a51fe..902ad293f2 100644 --- a/Libraries/LibJS/Tests/to-number-basic.js +++ b/Libraries/LibJS/Tests/to-number-basic.js @@ -9,6 +9,12 @@ try { assert(-null === 0); assert(+[] === 0); assert(-[] === 0); + assert(+[,] === 0); + assert(-[,] === 0); + assert(+[null] === 0); + assert(-[null] === 0); + assert(+[undefined] === 0); + assert(-[undefined] === 0); assert(+[[[[[]]]]] === 0); assert(-[[[[[]]]]] === 0); assert(+[[[[[42]]]]] === 42); @@ -35,8 +41,12 @@ try { assert(isNaN(-undefined)); assert(isNaN(+{})); assert(isNaN(-{})); - assert(isNaN(+{a: 1})); - assert(isNaN(-{a: 1})); + assert(isNaN(+{ a: 1 })); + assert(isNaN(-{ a: 1 })); + assert(isNaN(+[, , ,])); + assert(isNaN(-[, , ,])); + assert(isNaN(+[undefined, undefined])); + assert(isNaN(-[undefined, undefined])); assert(isNaN(+[1, 2, 3])); assert(isNaN(-[1, 2, 3])); assert(isNaN(+[[[["foo"]]]]));