+2008-02-22 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Alexey P.
+
+ <rdar://problem/5759327> REGRESSION: while(NaN) acts like while(true)
+
+ Fix yet another case where we incorrectly relied on implicit double
+ to bool coercion.
+
+ * kjs/nodes.cpp:
+ (KJS::PostDecLocalVarNode::evaluateToBoolean):
+
2008-02-20 Michael Knaup <michael.knaup@mac.com>
Reviewed by Darin.
bool PostDecLocalVarNode::evaluateToBoolean(ExecState* exec)
{
- return inlineEvaluateToNumber(exec);
+ double result = inlineEvaluateToNumber(exec);
+ return result > 0.0 || 0.0 > result; // NaN produces false as well
}
int32_t PostDecLocalVarNode::evaluateToInt32(ExecState* exec)
+2008-02-22 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Alexey P.
+
+ <rdar://problem/5759327> REGRESSION: while(NaN) acts like while(true)
+
+ Add test cases for pre/post-increment of NaN
+
+ * fast/js/convert-nan-to-bool-expected.txt:
+ * fast/js/resources/convert-nan-to-bool.js:
+
2008-02-21 Sam Weinig <sam@webkit.org>
Reviewed by Anders Carlsson.
PASS NaN && false ? true : false is false
PASS NaN || true ? true : false is true
PASS NaN || false ? true : false is false
+PASS (function(){var nan = NaN; return nan-- ? true : false})() is false
+PASS (function(){var nan = NaN; return nan++ ? true : false})() is false
+PASS (function(){var nan = NaN; return --nan ? true : false})() is false
+PASS (function(){var nan = NaN; return ++nan ? true : false})() is false
+PASS (function(){var Undefined = undefined; return Undefined-- ? true : false})() is false
+PASS (function(){var Undefined = undefined; return Undefined++ ? true : false})() is false
+PASS (function(){var Undefined = undefined; return --Undefined ? true : false})() is false
+PASS (function(){var Undefined = undefined; return ++Undefined ? true : false})() is false
PASS successfullyParsed is true
TEST COMPLETE
shouldBe("NaN && false ? true : false", "false");
shouldBe("NaN || true ? true : false", "true");
shouldBe("NaN || false ? true : false", "false");
+shouldBe("(function(){var nan = NaN; return nan-- ? true : false})()", "false");
+shouldBe("(function(){var nan = NaN; return nan++ ? true : false})()", "false");
+shouldBe("(function(){var nan = NaN; return --nan ? true : false})()", "false");
+shouldBe("(function(){var nan = NaN; return ++nan ? true : false})()", "false");
+shouldBe("(function(){var Undefined = undefined; return Undefined-- ? true : false})()", "false");
+shouldBe("(function(){var Undefined = undefined; return Undefined++ ? true : false})()", "false");
+shouldBe("(function(){var Undefined = undefined; return --Undefined ? true : false})()", "false");
+shouldBe("(function(){var Undefined = undefined; return ++Undefined ? true : false})()", "false");
var successfullyParsed = true;