+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.
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)
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)
+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.
--- /dev/null
+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
+
--- /dev/null
+<!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>
--- /dev/null
+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;