From: sgjesse@chromium.org Date: Wed, 6 Jul 2011 10:16:57 +0000 (+0000) Subject: Fix debug break on binary boolean operators X-Git-Tag: upstream/4.7.83~18966 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ca3787f39580716b1b6132533b035500dcf66ffe;p=platform%2Fupstream%2Fv8.git Fix debug break on binary boolean operators The syntax checker finding breakable statements did not take into account that the right hand side of a boolean binary opration might never get evaluated. R=svenpanne@chromium.org BUG=v8:1523 TEST=test/mjsunit/regress/regress-1523.js Review URL: http://codereview.chromium.org//7212027 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8544 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/full-codegen.cc b/src/full-codegen.cc index 70db611..0b91f54 100644 --- a/src/full-codegen.cc +++ b/src/full-codegen.cc @@ -242,7 +242,10 @@ void BreakableStatementChecker::VisitCountOperation(CountOperation* expr) { void BreakableStatementChecker::VisitBinaryOperation(BinaryOperation* expr) { Visit(expr->left()); - Visit(expr->right()); + if (expr->op() != Token::AND && + expr->op() != Token::OR) { + Visit(expr->right()); + } } diff --git a/test/mjsunit/regress/regress-1523.js b/test/mjsunit/regress/regress-1523.js new file mode 100644 index 0000000..30b3d59 --- /dev/null +++ b/test/mjsunit/regress/regress-1523.js @@ -0,0 +1,69 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// See: http://code.google.com/p/v8/issues/detail?id=1523 + +// Flags: --expose-debug-as debug +// Get the Debug object exposed from the debug context global object. + +Debug = debug.Debug + +var listenerCalled = false; +var result = -1; + +function listener(event, exec_state, event_data, data) { + listenerCalled = true; +}; + +// Add the debug event listener. +Debug.setListener(listener); + +function test_and(x) { + if (x && (bar === this.baz)) + return 0; + return 1; +} + +function test_or(x) { + if (x || (bar === this.baz)) + return 0; + return 1; +} + +// Set a break points and call each function to invoke the debug event listener. +Debug.setBreakPoint(test_and, 0, 0); +Debug.setBreakPoint(test_or, 0, 0); + +listenerCalled = false; +result = test_and(false); +assertEquals(1, result); +assertTrue(listenerCalled); + +listenerCalled = false; +result = test_or(true); +assertEquals(0, result); +assertTrue(listenerCalled);