diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 468de1eee4..8570b33ce0 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -4573,11 +4573,11 @@ void HOptimizedGraphBuilder::VisitBlock(Block* stmt) { HInstruction* inner_context = Add( outer_context, function, scope->GetScopeInfo()); HInstruction* instr = Add(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(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) { diff --git a/test/mjsunit/harmony/regress/regress-3741.js b/test/mjsunit/harmony/regress/regress-3741.js new file mode 100644 index 0000000000..8a9dd9e09c --- /dev/null +++ b/test/mjsunit/harmony/regress/regress-3741.js @@ -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({});