commit 7f7402dfe6120d8880602a6cf8b1415b88010b70
parent 085dd98a3681e748fdcd48ce66aea9b01b75ae2a
Author: Iain Ireland <iireland@mozilla.com>
Date: Thu, 13 Nov 2025 23:37:51 +0000
Bug 1998297: Use a macro for ToNumber and ToBoolean r=jandem
Drive-by: remove dead SameValueZero implementation
Differential Revision: https://phabricator.services.mozilla.com/D271332
Diffstat:
8 files changed, 21 insertions(+), 36 deletions(-)
diff --git a/js/src/builtin/Iterator.js b/js/src/builtin/Iterator.js
@@ -1672,13 +1672,13 @@ function IteratorCloseAllForException(iters) {
/**
* CreateNumericRangeIterator (start, end, optionOrStep, type)
- * Step 18
- *
+ * Step 18
+ *
* https://tc39.es/proposal-iterator.range/#sec-create-numeric-range-iterator
*/
function IteratorRangeNext() {
var obj = this;
- // Step 18. Let closure be a new Abstract Closure with no parameters
+ // Step 18. Let closure be a new Abstract Closure with no parameters
// that captures start, end, step, inclusiveEnd, zero, one and performs the following steps when called:
if (!IsObject(obj) || (obj = GuardToIteratorRange(obj)) === null) {
@@ -1728,7 +1728,7 @@ function IteratorRangeNext() {
// Step 18.i.iv: If ifIncrease is true, then
if (ifIncrease) {
- // Step 18.i.iv.1: If inclusiveEnd is true, then
+ // Step 18.i.iv.1: If inclusiveEnd is true, then
if (inclusiveEnd) {
// Step 18.i.iv.1.a: If currentYieldingValue > end, return undefined.
if (currentYieldingValue > end) {
@@ -1773,7 +1773,7 @@ function IteratorRangeNext() {
/**
* CreateNumericRangeIterator (start, end, optionOrStep, type)
- *
+ *
* https://tc39.es/proposal-iterator.range/#sec-create-numeric-range-iterator
*/
function CreateNumericRangeIterator(start, end, optionOrStep, isNumberRange) {
@@ -1836,7 +1836,7 @@ function CreateNumericRangeIterator(start, end, optionOrStep, isNumberRange) {
step = optionOrStep.step;
// Step 8.b. Set inclusiveEnd to ToBoolean(? Get(optionOrStep, "inclusive")).
- inclusiveEnd = ToBoolean(optionOrStep.inclusiveEnd);
+ inclusiveEnd = TO_BOOLEAN(optionOrStep.inclusiveEnd);
}
// Step 9: Else if type is NUMBER-RANGE and optionOrStep is a Number, then
else if (isNumberRange && typeof optionOrStep === 'number') {
diff --git a/js/src/builtin/Number.js b/js/src/builtin/Number.js
@@ -60,9 +60,9 @@ function Number_isSafeInteger(number) {
}
function Global_isNaN(number) {
- return Number_isNaN(ToNumber(number));
+ return Number_isNaN(TO_NUMBER(number));
}
function Global_isFinite(number) {
- return Number_isFinite(ToNumber(number));
+ return Number_isFinite(TO_NUMBER(number));
}
diff --git a/js/src/builtin/SelfHostingDefines.h b/js/src/builtin/SelfHostingDefines.h
@@ -25,6 +25,12 @@
// simple Object (with null prototype) as a convenient implementation.
#define NEW_RECORD() std_Object_create(null)
+/* Spec: ECMAScript Language Specification, 5.1 edition, 9.2 and 11.4.9 */
+#define TO_BOOLEAN(v) !!v
+
+/* Spec: ECMAScript Language Specification, 5.1 edition, 9.3 and 11.4.6 */
+#define TO_NUMBER(v) +v
+
// NB: keep this in sync with the copy in vm/ArgumentsObject.h.
#define MAX_ARGS_LENGTH (500 * 1000)
diff --git a/js/src/builtin/Utilities.js b/js/src/builtin/Utilities.js
@@ -30,22 +30,6 @@
/********** Abstract operations defined in ECMAScript Language Specification **********/
-/* Spec: ECMAScript Language Specification, 5.1 edition, 9.2 and 11.4.9 */
-function ToBoolean(v) {
- return !!v;
-}
-
-/* Spec: ECMAScript Language Specification, 5.1 edition, 9.3 and 11.4.6 */
-function ToNumber(v) {
- return +v;
-}
-
-// ES2017 draft rev aebf014403a3e641fb1622aec47c40f051943527
-// 7.2.10 SameValueZero ( x, y )
-function SameValueZero(x, y) {
- return x === y || (x !== x && y !== y);
-}
-
// ES 2017 draft (April 6, 2016) 7.3.9
function GetMethod(V, P) {
// Step 1.
diff --git a/js/src/builtin/intl/CommonFunctions.js b/js/src/builtin/intl/CommonFunctions.js
@@ -654,7 +654,7 @@ function GetOption(options, property, type, values, fallback) {
if (value !== undefined) {
// Steps 2.a-c.
if (type === "boolean") {
- value = ToBoolean(value);
+ value = TO_BOOLEAN(value);
} else if (type === "string") {
value = ToString(value);
} else {
@@ -752,7 +752,7 @@ function DefaultNumberOption(value, minimum, maximum, fallback) {
}
// Step 2.
- value = ToNumber(value);
+ value = TO_NUMBER(value);
// Step 3.
if (Number_isNaN(value) || value < minimum || value > maximum) {
diff --git a/js/src/builtin/intl/PluralRules.js b/js/src/builtin/intl/PluralRules.js
@@ -278,7 +278,7 @@ function Intl_PluralRules_select(value) {
}
// Step 3.
- var n = ToNumber(value);
+ var n = TO_NUMBER(value);
// Ensure the PluralRules internals are resolved.
getPluralRulesInternals(pluralRules);
@@ -325,10 +325,10 @@ function Intl_PluralRules_selectRange(start, end) {
}
// Step 4.
- var x = ToNumber(start);
+ var x = TO_NUMBER(start);
// Step 5.
- var y = ToNumber(end);
+ var y = TO_NUMBER(end);
// Step 6.
return intl_SelectPluralRuleRange(pluralRules, x, y);
diff --git a/js/src/builtin/intl/RelativeTimeFormat.js b/js/src/builtin/intl/RelativeTimeFormat.js
@@ -245,7 +245,7 @@ function Intl_RelativeTimeFormat_format(value, unit) {
}
// Step 3.
- var t = ToNumber(value);
+ var t = TO_NUMBER(value);
// Step 4.
var u = ToString(unit);
@@ -282,7 +282,7 @@ function Intl_RelativeTimeFormat_formatToParts(value, unit) {
}
// Step 3.
- var t = ToNumber(value);
+ var t = TO_NUMBER(value);
// Step 4.
var u = ToString(unit);
diff --git a/js/src/tests/non262/Number/ToNumber.js b/js/src/tests/non262/Number/ToNumber.js
@@ -17,10 +17,5 @@ assertEq(Number("0o88"), NaN);
assertEq(Number("-0o66"), NaN);
assertEq(+"0o66", 54);
-if(typeof getSelfHostedValue === "function"){
- assertEq(getSelfHostedValue("ToNumber")("0b11"), 3);
- assertEq(getSelfHostedValue("ToNumber")("0o66"), 54);
-}
-
if (typeof reportCompare === "function")
reportCompare(true, true);