# HG changeset patch # User hannesw # Date 1448288770 -3600 # Node ID 2637e398e0a40619e219d8ce32abefb3fa518287 # Parent 2e8c1be40a52d7d6fefb5a094a95e1467f06ed42 8141407: Wrong evaluation of a != a when a = NaN Reviewed-by: sundar, attila diff -r 2e8c1be40a52 -r 2637e398e0a4 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Thu Nov 19 14:37:14 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Nov 23 15:26:10 2015 +0100 @@ -756,7 +756,9 @@ /** ECMA 11.9.3 The Abstract Equality Comparison Algorithm */ private static boolean equals(final Object x, final Object y) { - if (x == y) { + // We want to keep this method small so we skip reference equality check for numbers + // as NaN should return false when compared to itself (JDK-8043608). + if (x == y && !(x instanceof Number)) { return true; } if (x instanceof ScriptObject && y instanceof ScriptObject) { diff -r 2e8c1be40a52 -r 2637e398e0a4 nashorn/test/script/basic/JDK-8141407.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8141407.js Mon Nov 23 15:26:10 2015 +0100 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8141407: Wrong evaluation of a != a when a = NaN + * + * @test + * @run + */ + +function expectNotEqualToSelf(a) { + Assert.assertFalse(a == a); + Assert.assertFalse(a === a); + Assert.assertTrue(a != a); + Assert.assertTrue(a !== a); +} + +// In previous versions of Nashorn this failed only on the second assignment, +// because only then the property slot was widened to object. +var a = NaN; +expectNotEqualToSelf(a); +a = {}; +a = NaN; +expectNotEqualToSelf(a); + +// We do have to do value-based rather than reference-based comparison for +// java.lang.Double since that class is used to represent primitive numbers +// in JavaScript. +var b = new java.lang.Double(NaN); +expectNotEqualToSelf(b); +b = {}; +b = new java.lang.Double(NaN); +expectNotEqualToSelf(b); + +// Although float is not used internally by Nashorn, java.lang.Float +// is handled like a primitive number in most of Nashorn, so for consistency +// we treat it like java.lang.Double. +var c = new java.lang.Float(NaN); +expectNotEqualToSelf(c); +c = {}; +c = new java.lang.Float(NaN); +expectNotEqualToSelf(c);