Skip to content

Commit

Permalink
Merge pull request #28 from RoboPhred/short-circuit-evaluation
Browse files Browse the repository at this point in the history
Short circuit evaluation
  • Loading branch information
goto-bus-stop committed Mar 7, 2020
2 parents 995a736 + 7c6c029 commit 19422b2
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 3 deletions.
22 changes: 19 additions & 3 deletions index.js
Expand Up @@ -40,12 +40,30 @@ module.exports = function (ast, vars) {
}
else if (node.type === 'BinaryExpression' ||
node.type === 'LogicalExpression') {
var op = node.operator;

if (op === '&&') {
var l = walk(node.left);
if (l === FAIL) return FAIL;
if (!l) return l;
var r = walk(node.right);
if (r === FAIL) return FAIL;
return r;
}
else if (op === '||') {
var l = walk(node.left);
if (l === FAIL) return FAIL;
if (l) return l;
var r = walk(node.right);
if (r === FAIL) return FAIL;
return r;
}

var l = walk(node.left);
if (l === FAIL) return FAIL;
var r = walk(node.right);
if (r === FAIL) return FAIL;

var op = node.operator;
if (op === '==') return l == r;
if (op === '===') return l === r;
if (op === '!=') return l != r;
Expand All @@ -62,8 +80,6 @@ module.exports = function (ast, vars) {
if (op === '|') return l | r;
if (op === '&') return l & r;
if (op === '^') return l ^ r;
if (op === '&&') return l && r;
if (op === '||') return l || r;

return FAIL;
}
Expand Down
26 changes: 26 additions & 0 deletions test/eval.js
Expand Up @@ -121,3 +121,29 @@ test('constructor at runtime only', function(t) {
var res = evaluate(ast);
t.equal(res, undefined);
});

test('short circuit evaluation AND', function(t) {
t.plan(1);

var variables = {
value: null
};
var src = 'value && value.func()';
var ast = parse(src).body[0].expression;
var res = evaluate(ast, variables);
t.equals(res, null);
})

test('short circuit evaluation OR', function(t) {
t.plan(1);

var fnInvoked = false;
var variables = {
value: true,
fn: function() { fnInvoked = true}
};
var src = 'value || fn()';
var ast = parse(src).body[0].expression;
evaluate(ast, variables);
t.equals(fnInvoked, false);
})

0 comments on commit 19422b2

Please sign in to comment.