Make operators &&, || behave like in JavaScript

fixes #8290
This commit is contained in:
Gunnar Beutner 2015-01-27 08:40:19 +01:00
parent 8c4c7f0953
commit b858a05f15
2 changed files with 17 additions and 7 deletions

View File

@ -163,8 +163,8 @@ Operator | Examples (Result) | Description
^ | 17 ^ 12 (29) | Bitwise XOR
& | 7 & 3 (3) | Binary AND
| | 2 | 3 (3) | Binary OR
&& | true && false (false) | Logical AND
|| | true || false (true) | Logical OR
&& | true && false (false), 3 && 7 (7), 0 && 7 (0) | Logical AND
|| | true || false (true), 0 || 7 (7)| Logical OR
< | 3 < 5 (true) | Less than
> | 3 > 5 (false) | Greater than
<= | 3 <= 3 (true) | Less than or equal
@ -432,9 +432,9 @@ UserGroup | user
## <a id="boolean-values"></a> Boolean Values
The `assign where` and `ignore where` statements, the `!`, `&&` and `||`
operators as well as the `bool()` function convert their arguments to a
boolean value based on the following rules:
The `assign where`, `ignore where`, `if` and `while` statements, the `!` operator as
well as the `bool()` function convert their arguments to a boolean value based on the
following rules:
Description | Example Value | Boolean Value
---------------------|-------------------|--------------

View File

@ -249,12 +249,22 @@ Value NotInExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
Value LogicalAndExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
{
return m_Operand1->Evaluate(frame).ToBool() && m_Operand2->Evaluate(frame).ToBool();
Value left = m_Operand1->Evaluate(frame);
if (!left.ToBool())
return left;
else
return m_Operand2->Evaluate(frame);
}
Value LogicalOrExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
{
return m_Operand1->Evaluate(frame).ToBool() || m_Operand2->Evaluate(frame).ToBool();
Value left = m_Operand1->Evaluate(frame);
if (left.ToBool())
return left;
else
return m_Operand2->Evaluate(frame);
}
Value FunctionCallExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const