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