Hydrogen: bailout when there is a throw statement in a non-effect context.

This mirrors the behavior of the compilation pipeline before recent OptimizeFunctionOnNextCall changes.

BUG=chromium:412208
LOG=n
R=jarin@chromium.org

Review URL: https://codereview.chromium.org/558593002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23799 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 34a659ae
......@@ -6753,10 +6753,12 @@ void HOptimizedGraphBuilder::VisitThrow(Throw* expr) {
DCHECK(!HasStackOverflow());
DCHECK(current_block() != NULL);
DCHECK(current_block()->HasPredecessor());
// We don't optimize functions with invalid left-hand sides in
// assignments, count operations, or for-in. Consequently throw can
// currently only occur in an effect context.
DCHECK(ast_context()->IsEffect());
if (!ast_context()->IsEffect()) {
// The parser turns invalid left-hand sides in assignments into throw
// statements, which may not be in effect contexts. We might still try
// to optimize such functions; bail out now if we do.
return Bailout(kInvalidLeftHandSideInAssignment);
}
CHECK_ALIVE(VisitForValue(expr->exception()));
HValue* value = environment()->Pop();
......
// Copyright 2014 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.
// Flags: --allow-natives-syntax
var non_const_true = true;
function f() {
return non_const_true || (f() = this);
}
assertTrue(f());
assertTrue(f());
%OptimizeFunctionOnNextCall(f);
assertTrue(f());
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment