<rdar://problem/5737003> REGRESSION (r27747): can't browse pictures on fastcupid.com
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Feb 2008 09:51:59 +0000 (09:51 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Feb 2008 09:51:59 +0000 (09:51 +0000)
Reviewed by Alexey P.

When converting numeric values to booleans we need to account for NaN

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@30191 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/convert-nan-to-bool-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/convert-nan-to-bool.html [new file with mode: 0644]
LayoutTests/fast/js/resources/convert-nan-to-bool.js [new file with mode: 0644]

index 785bf28..3cd8388 100644 (file)
@@ -1,3 +1,15 @@
+2008-02-13  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Alexey P.
+
+        <rdar://problem/5737003> REGRESSION (r27747): can't browse pictures on fastcupid.com
+
+        When converting numeric values to booleans we need to account for NaN
+
+        * kjs/nodes.cpp:
+        (KJS::MultNode::evaluateToBoolean):
+        (KJS::ModNode::evaluateToBoolean):
+
 2008-02-08  Samuel Weinig  <sam@webkit.org>
 
         Reviewed by Brady Eidson.
index fa1fe23..a2eaf36 100644 (file)
@@ -2135,7 +2135,8 @@ double MultNode::evaluateToNumber(ExecState* exec)
 
 bool MultNode::evaluateToBoolean(ExecState* exec)
 {
-    return inlineEvaluateToNumber(exec);
+    double result = inlineEvaluateToNumber(exec);
+    return  result > 0.0 || 0.0 > result; // NaN produces false as well
 }
 
 int32_t MultNode::evaluateToInt32(ExecState* exec)
@@ -2210,7 +2211,8 @@ double ModNode::evaluateToNumber(ExecState* exec)
 
 bool ModNode::evaluateToBoolean(ExecState* exec)
 {
-    return inlineEvaluateToNumber(exec);
+    double result = inlineEvaluateToNumber(exec);
+    return  result > 0.0 || 0.0 > result; // NaN produces false as well
 }
 
 int32_t ModNode::evaluateToInt32(ExecState* exec)
index e9aa5fd..1c927c4 100644 (file)
@@ -1,3 +1,15 @@
+2008-02-13  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Alexey P.
+
+        Tests for <rdar://problem/5737003> REGRESSION (r27747): can't browse pictures on fastcupid.com
+
+        Ensure that the basic arithmetic operands can correctly handle the NaN -> boolean conversion
+
+        * fast/js/convert-nan-to-bool.html: Added.
+        * fast/js/convert-nan-to-bool-expected.txt: Added.
+        * fast/js/resources/convert-nan-to-bool.js: Added.
+
 2008-02-12  Dan Bernstein  <mitz@apple.com>
 
         Rubber-stamped by Adam Roben.
diff --git a/LayoutTests/fast/js/convert-nan-to-bool-expected.txt b/LayoutTests/fast/js/convert-nan-to-bool-expected.txt
new file mode 100644 (file)
index 0000000..3d5d836
--- /dev/null
@@ -0,0 +1,66 @@
+This test ensures that NaN is handled correctly when converting numeric expressions to booleans.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS NaN ? true : false is false
+PASS 1 ? true : false is true
+PASS 0 ? true : false is false
+PASS -1 ? true : false is true
+PASS 1 * -1 ? true : false is true
+PASS 1 * 0 ? true : false is false
+PASS 1 * 1 ? true : false is true
+PASS 1 / -1 ? true : false is true
+PASS 1 / 0 ? true : false is true
+PASS 1 / 1 ? true : false is true
+PASS 1 % 2 ? true : false is true
+PASS 1 % 1 ? true : false is false
+PASS 1 + -1 ? true : false is false
+PASS 1 + 0 ? true : false is true
+PASS 1 + 1 ? true : false is true
+PASS 1 - -1 ? true : false is true
+PASS 1 - 0 ? true : false is true
+PASS 1 - 1 ? true : false is false
+PASS 1 & -1 ? true : false is true
+PASS 1 & 0 ? true : false is false
+PASS 1 & 1 ? true : false is true
+PASS 1 | -1 ? true : false is true
+PASS 1 | 0 ? true : false is true
+PASS 1 | 1 ? true : false is true
+PASS 1 ^ -1 ? true : false is true
+PASS 1 ^ 0 ? true : false is true
+PASS 1 ^ 1 ? true : false is false
+PASS NaN * -1 ? true : false is false
+PASS NaN * 0? true : false is false
+PASS NaN * 1? true : false is false
+PASS NaN / -1 ? true : false is false
+PASS NaN / 0? true : false is false
+PASS NaN / 1? true : false is false
+PASS NaN % -1 ? true : false is false
+PASS NaN % 0? true : false is false
+PASS NaN % 1? true : false is false
+PASS NaN + -1 ? true : false is false
+PASS NaN + 0? true : false is false
+PASS NaN + 1? true : false is false
+PASS NaN - -1 ? true : false is false
+PASS NaN - 0? true : false is false
+PASS NaN - 1? true : false is false
+PASS NaN & -1 ? true : false is false
+PASS NaN & 0? true : false is false
+PASS NaN & 1? true : false is false
+PASS NaN | -1 ? true : false is true
+PASS NaN | 0? true : false is false
+PASS NaN | 1? true : false is true
+PASS NaN ^ -1 ? true : false is true
+PASS NaN ^ 0? true : false is false
+PASS NaN ^ 1? true : false is true
+PASS +NaN ? true : false is false
+PASS -NaN ? true : false is false
+PASS NaN && true ? true : false is false
+PASS NaN && false ? true : false is false
+PASS NaN || true ? true : false is true
+PASS NaN || false ? true : false is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/convert-nan-to-bool.html b/LayoutTests/fast/js/convert-nan-to-bool.html
new file mode 100644 (file)
index 0000000..36d61b9
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="resources/js-test-style.css">
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/convert-nan-to-bool.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/js/resources/convert-nan-to-bool.js b/LayoutTests/fast/js/resources/convert-nan-to-bool.js
new file mode 100644 (file)
index 0000000..273bb42
--- /dev/null
@@ -0,0 +1,61 @@
+description("This test ensures that NaN is handled correctly when converting numeric expressions to booleans.");
+
+shouldBe("NaN ? true : false", "false");
+shouldBe("1 ? true : false", "true");
+shouldBe("0 ? true : false", "false");
+shouldBe("-1 ? true : false", "true");
+shouldBe("1 * -1 ? true : false", "true");
+shouldBe("1 * 0 ? true : false", "false");
+shouldBe("1 * 1 ? true : false", "true");
+shouldBe("1 / -1 ? true : false", "true");
+shouldBe("1 / 0 ? true : false", "true");
+shouldBe("1 / 1 ? true : false", "true");
+shouldBe("1 % 2 ? true : false", "true");
+shouldBe("1 % 1 ? true : false", "false");
+shouldBe("1 + -1 ? true : false", "false");
+shouldBe("1 + 0 ? true : false", "true");
+shouldBe("1 + 1 ? true : false", "true");
+shouldBe("1 - -1 ? true : false", "true");
+shouldBe("1 - 0 ? true : false", "true");
+shouldBe("1 - 1 ? true : false", "false");
+shouldBe("1 & -1 ? true : false", "true");
+shouldBe("1 & 0 ? true : false", "false");
+shouldBe("1 & 1 ? true : false", "true");
+shouldBe("1 | -1 ? true : false", "true");
+shouldBe("1 | 0 ? true : false", "true");
+shouldBe("1 | 1 ? true : false", "true");
+shouldBe("1 ^ -1 ? true : false", "true");
+shouldBe("1 ^ 0 ? true : false", "true");
+shouldBe("1 ^ 1 ? true : false", "false");
+shouldBe("NaN * -1 ? true : false", "false");
+shouldBe("NaN * 0? true : false", "false");
+shouldBe("NaN * 1? true : false", "false");
+shouldBe("NaN / -1 ? true : false", "false");
+shouldBe("NaN / 0? true : false", "false");
+shouldBe("NaN / 1? true : false", "false");
+shouldBe("NaN % -1 ? true : false", "false");
+shouldBe("NaN % 0? true : false", "false");
+shouldBe("NaN % 1? true : false", "false");
+shouldBe("NaN + -1 ? true : false", "false");
+shouldBe("NaN + 0? true : false", "false");
+shouldBe("NaN + 1? true : false", "false");
+shouldBe("NaN - -1 ? true : false", "false");
+shouldBe("NaN - 0? true : false", "false");
+shouldBe("NaN - 1? true : false", "false");
+shouldBe("NaN & -1 ? true : false", "false");
+shouldBe("NaN & 0? true : false", "false");
+shouldBe("NaN & 1? true : false", "false");
+shouldBe("NaN | -1 ? true : false", "true");
+shouldBe("NaN | 0? true : false", "false");
+shouldBe("NaN | 1? true : false", "true");
+shouldBe("NaN ^ -1 ? true : false", "true");
+shouldBe("NaN ^ 0? true : false", "false");
+shouldBe("NaN ^ 1? true : false", "true");
+shouldBe("+NaN ? true : false", "false");
+shouldBe("-NaN ? true : false", "false");
+shouldBe("NaN && true ? true : false", "false");
+shouldBe("NaN && false ? true : false", "false");
+shouldBe("NaN || true ? true : false", "true");
+shouldBe("NaN || false ? true : false", "false");
+
+var successfullyParsed = true;