Fix the order of context binding/simulate insertion for BlockContexts.
R=jarin@chromium.org BUG=v8:3741 LOG=N Review URL: https://codereview.chromium.org/762393008 Cr-Commit-Position: refs/heads/master@{#25684}
This commit is contained in:
parent
1150cf7f9a
commit
bd04e6cdad
@ -4573,11 +4573,11 @@ void HOptimizedGraphBuilder::VisitBlock(Block* stmt) {
|
|||||||
HInstruction* inner_context = Add<HAllocateBlockContext>(
|
HInstruction* inner_context = Add<HAllocateBlockContext>(
|
||||||
outer_context, function, scope->GetScopeInfo());
|
outer_context, function, scope->GetScopeInfo());
|
||||||
HInstruction* instr = Add<HStoreFrameContext>(inner_context);
|
HInstruction* instr = Add<HStoreFrameContext>(inner_context);
|
||||||
|
set_scope(scope);
|
||||||
|
environment()->BindContext(inner_context);
|
||||||
if (instr->HasObservableSideEffects()) {
|
if (instr->HasObservableSideEffects()) {
|
||||||
AddSimulate(stmt->EntryId(), REMOVABLE_SIMULATE);
|
AddSimulate(stmt->EntryId(), REMOVABLE_SIMULATE);
|
||||||
}
|
}
|
||||||
set_scope(scope);
|
|
||||||
environment()->BindContext(inner_context);
|
|
||||||
VisitDeclarations(scope->declarations());
|
VisitDeclarations(scope->declarations());
|
||||||
AddSimulate(stmt->DeclsId(), REMOVABLE_SIMULATE);
|
AddSimulate(stmt->DeclsId(), REMOVABLE_SIMULATE);
|
||||||
}
|
}
|
||||||
@ -4591,10 +4591,10 @@ void HOptimizedGraphBuilder::VisitBlock(Block* stmt) {
|
|||||||
HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX));
|
HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX));
|
||||||
|
|
||||||
HInstruction* instr = Add<HStoreFrameContext>(outer_context);
|
HInstruction* instr = Add<HStoreFrameContext>(outer_context);
|
||||||
|
environment()->BindContext(outer_context);
|
||||||
if (instr->HasObservableSideEffects()) {
|
if (instr->HasObservableSideEffects()) {
|
||||||
AddSimulate(stmt->ExitId(), REMOVABLE_SIMULATE);
|
AddSimulate(stmt->ExitId(), REMOVABLE_SIMULATE);
|
||||||
}
|
}
|
||||||
environment()->BindContext(outer_context);
|
|
||||||
}
|
}
|
||||||
HBasicBlock* break_block = break_info.break_block();
|
HBasicBlock* break_block = break_info.break_block();
|
||||||
if (break_block != NULL) {
|
if (break_block != NULL) {
|
||||||
|
26
test/mjsunit/harmony/regress/regress-3741.js
Normal file
26
test/mjsunit/harmony/regress/regress-3741.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// 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: --harmony-scoping --allow-natives-syntax
|
||||||
|
'use strict';
|
||||||
|
function f24(deopt) {
|
||||||
|
let x = 1;
|
||||||
|
{
|
||||||
|
let x = 2;
|
||||||
|
{
|
||||||
|
let x = 3;
|
||||||
|
assertEquals(3, x);
|
||||||
|
}
|
||||||
|
deopt + 1;
|
||||||
|
assertEquals(2, x);
|
||||||
|
}
|
||||||
|
assertEquals(1, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (var j = 0; j < 10; ++j) {
|
||||||
|
f24(12);
|
||||||
|
}
|
||||||
|
%OptimizeFunctionOnNextCall(f24);
|
||||||
|
f24({});
|
Loading…
Reference in New Issue
Block a user