Bug 460452 - NaN is a boolish false. Also constant fold booleans next to operator NOT. r=brendan

This commit is contained in:
Blake Kaplan 2008-10-17 18:59:05 -07:00
Родитель 0079e10c80
Коммит cd748b3d56
1 изменённых файлов: 9 добавлений и 1 удалений

Просмотреть файл

@ -6279,7 +6279,7 @@ Boolish(JSParseNode *pn)
{
switch (pn->pn_op) {
case JSOP_DOUBLE:
return pn->pn_dval != 0;
return pn->pn_dval != 0 && !JSDOUBLE_IS_NaN(pn->pn_dval);
case JSOP_STRING:
return JSSTRING_LENGTH(ATOM_TO_STRING(pn->pn_atom)) != 0;
@ -6728,6 +6728,14 @@ js_FoldConstants(JSContext *cx, JSParseNode *pn, JSTreeContext *tc, bool inCond)
pn->pn_arity = PN_NULLARY;
pn->pn_dval = d;
RecycleTree(pn1, tc);
} else if (pn1->pn_type == TOK_PRIMARY) {
if (pn->pn_op == JSOP_NOT &&
(pn1->pn_op == JSOP_TRUE ||
pn1->pn_op == JSOP_FALSE)) {
PN_MOVE_NODE(pn, pn1);
pn->pn_op = (pn->pn_op == JSOP_TRUE) ? JSOP_FALSE : JSOP_TRUE;
RecycleTree(pn1, tc);
}
}
break;