Skip to content

Commit d9ec88e

Browse files
committed
Logical assignment operators added
1 parent afb4a5d commit d9ec88e

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
var b = { b: 2 };
2+
b.b += 2;
3+
b.b &&= 1;
4+
assert.strictEqual('{"b":1}', JSON.stringify(b));
5+
6+
b.b = 0;
7+
b.b &&= 1;
8+
assert.strictEqual('{"b":0}', JSON.stringify(b));
9+
10+
let called = false;
11+
function getValue(i) {
12+
called = true;
13+
return i;
14+
}
15+
16+
b.b = 0;
17+
b.b &&= getValue(1);
18+
assert.strictEqual(false, called);
19+
assert.strictEqual('{"b":0}', JSON.stringify(b));
20+
21+
b.b = 1;
22+
b.b &&= getValue(1);
23+
assert.strictEqual(true, called);
24+
assert.strictEqual('{"b":1}', JSON.stringify(b));
25+
26+
called = false;
27+
b.b = 0;
28+
b.b ||= getValue(1);
29+
assert.strictEqual(true, called);
30+
assert.strictEqual('{"b":1}', JSON.stringify(b));
31+
32+
called = false;
33+
b.b = 1;
34+
b.b ||= getValue(1);
35+
assert.strictEqual(false, called);
36+
assert.strictEqual('{"b":1}', JSON.stringify(b));

YantraJS.Core/FastParser/FastScanner.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,11 @@ private FastToken _ReadToken()
372372
case '&':
373373
switch (Consume()) {
374374
case '&':
375-
Consume();
375+
if(Consume() == '=')
376+
{
377+
Consume();
378+
return state.Commit(TokenTypes.AssignBooleanAnd);
379+
}
376380
return state.Commit(TokenTypes.BooleanAnd);
377381
case '=':
378382
Consume();
@@ -383,7 +387,11 @@ private FastToken _ReadToken()
383387
switch (Consume())
384388
{
385389
case '|':
386-
Consume();
390+
if(Consume() == '=')
391+
{
392+
Consume();
393+
return state.Commit(TokenTypes.AssignBooleanOr);
394+
}
387395
return state.Commit(TokenTypes.BooleanOr);
388396
case '=':
389397
Consume();

YantraJS.Core/FastParser/TokenTypes.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public enum TokenTypes
6363
AssignLeftShift,
6464
AssignCoalesce,
6565
AssignPower,
66+
AssignBooleanAnd,
67+
AssignBooleanOr,
6668

6769
// not used...
6870
EndAssignTokens,

YantraJS.Core/Utils/BinaryOperation.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ public static Expression Assign(Expression left, Expression right, TokenTypes as
113113
return Assign(left, right);
114114
case TokenTypes.AssignAdd:
115115
return Assign(left, ExpHelper.JSValueBuilder.Add(left, right));
116+
case TokenTypes.AssignBooleanAnd:
117+
return Assign(left, JSValueBuilder.LogicalAnd(left, right));
118+
case TokenTypes.AssignBooleanOr:
119+
return Assign(left, JSValueBuilder.LogicalOr(left, right));
116120
}
117121

118122
var leftDouble = ExpHelper.JSValueBuilder.DoubleValue(left);

0 commit comments

Comments
 (0)