diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc index acbe53a4b4..83a2ae21a6 100644 --- a/src/interpreter/bytecode-generator.cc +++ b/src/interpreter/bytecode-generator.cc @@ -2839,7 +2839,7 @@ void BytecodeGenerator::VisitLogicalOrExpression(BinaryOperation* binop) { if (execution_result()->IsTest()) { TestResultScope* test_result = execution_result()->AsTest(); - if (left->ToBooleanIsTrue() || right->ToBooleanIsTrue()) { + if (left->ToBooleanIsTrue()) { builder()->Jump(test_result->NewThenLabel()); } else if (left->ToBooleanIsFalse() && right->ToBooleanIsFalse()) { builder()->Jump(test_result->NewElseLabel()); @@ -2874,7 +2874,7 @@ void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) { if (execution_result()->IsTest()) { TestResultScope* test_result = execution_result()->AsTest(); - if (left->ToBooleanIsFalse() || right->ToBooleanIsFalse()) { + if (left->ToBooleanIsFalse()) { builder()->Jump(test_result->NewElseLabel()); } else if (left->ToBooleanIsTrue() && right->ToBooleanIsTrue()) { builder()->Jump(test_result->NewThenLabel()); diff --git a/test/mjsunit/ignition/regress-664146.js b/test/mjsunit/ignition/regress-664146.js new file mode 100644 index 0000000000..415713a92f --- /dev/null +++ b/test/mjsunit/ignition/regress-664146.js @@ -0,0 +1,27 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var foo_call_count = 0; +function foo() { foo_call_count++; } + +// These || and && combinations shouldn't call foo(). +(true || foo()) ? 1 : 2; +assertTrue(foo_call_count == 0); +(false && foo()) ? 1 : 2; +assertTrue(foo_call_count == 0); + +// These || and && combinations should all call foo(). +(foo() || true) ? 1 : 2; +assertTrue(foo_call_count == 1); +(false || foo()) ? 1 : 2; +assertTrue(foo_call_count == 2); +(foo() || false) ? 1 : 2; +assertTrue(foo_call_count == 3); + +(true && foo()) ? 1 : 2; +assertTrue(foo_call_count == 4); +(foo() && true) ? 1 : 2; +assertTrue(foo_call_count == 5); +(foo() && false) ? 1 : 2; +assertTrue(foo_call_count == 6);