diff --git a/js/src/jsnum.cpp b/js/src/jsnum.cpp --- a/js/src/jsnum.cpp +++ b/js/src/jsnum.cpp @@ -1569,17 +1569,17 @@ js::NonObjectToNumberSlow(ThreadSafeCont *out = v.toBoolean() ? 1.0 : 0.0; return true; } if (v.isNull()) { *out = 0.0; return true; } - JS_ASSERT(v.isUndefined()); + JS_ASSERT(v.isUndefined() || v.isSymbol()); *out = GenericNaN(); return true; } #if defined(_MSC_VER) # pragma optimize("g", off) #endif diff --git a/js/src/tests/ecma_6/Symbol/comparisons.js b/js/src/tests/ecma_6/Symbol/comparisons.js new file mode 100644 --- /dev/null +++ b/js/src/tests/ecma_6/Symbol/comparisons.js @@ -0,0 +1,26 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ */ + +var symbols = [ + Symbol(), + Symbol("0"), + Symbol.for("snowman"), + Symbol.iterator +]; + +var values = [ + undefined, null, 0, 3.14, -0, NaN, "", "alphabet", Symbol("0"), + {}, [] +]; + +for (var comparator of ["==", "!=", "===", "!==", "<", "<=", ">", ">="]) { + var f = Function("a, b", "return a " + comparator + " b;"); + var expected = (comparator[0] == '!'); + for (var a of symbols) { + for (var b of values) + assertEq(f(a, b), expected); + } +} + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_6/Symbol/conversions.js b/js/src/tests/ecma_6/Symbol/conversions.js --- a/js/src/tests/ecma_6/Symbol/conversions.js +++ b/js/src/tests/ecma_6/Symbol/conversions.js @@ -8,11 +8,15 @@ var symbols = [ ]; for (var sym of symbols) { // 7.1.2 ToBoolean assertEq(Boolean(sym), true); assertEq(!sym, false); assertEq(sym || 13, sym); assertEq(sym && 13, 13); + + // 7.1.3 ToNumber + assertEq(+sym, NaN); + assertEq(sym | 0, 0); } reportCompare(0, 0);