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>(
|
||||
outer_context, function, scope->GetScopeInfo());
|
||||
HInstruction* instr = Add<HStoreFrameContext>(inner_context);
|
||||
set_scope(scope);
|
||||
environment()->BindContext(inner_context);
|
||||
if (instr->HasObservableSideEffects()) {
|
||||
AddSimulate(stmt->EntryId(), REMOVABLE_SIMULATE);
|
||||
}
|
||||
set_scope(scope);
|
||||
environment()->BindContext(inner_context);
|
||||
VisitDeclarations(scope->declarations());
|
||||
AddSimulate(stmt->DeclsId(), REMOVABLE_SIMULATE);
|
||||
}
|
||||
@ -4591,10 +4591,10 @@ void HOptimizedGraphBuilder::VisitBlock(Block* stmt) {
|
||||
HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX));
|
||||
|
||||
HInstruction* instr = Add<HStoreFrameContext>(outer_context);
|
||||
environment()->BindContext(outer_context);
|
||||
if (instr->HasObservableSideEffects()) {
|
||||
AddSimulate(stmt->ExitId(), REMOVABLE_SIMULATE);
|
||||
}
|
||||
environment()->BindContext(outer_context);
|
||||
}
|
||||
HBasicBlock* break_block = break_info.break_block();
|
||||
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