From a2ac40aca7b0eea450eab617119d18060532a0be Mon Sep 17 00:00:00 2001 From: "wingo@igalia.com" Date: Tue, 22 Apr 2014 11:34:16 +0000 Subject: [PATCH] Context-allocate all parameters in generators Generator function scopes have forced context allocation. Ensure that all variables in such scopes get context allocation -- even unused variables. This fixes an assertion when reifying generator scopes in the debugger. R=yangguo@chromium.org LOG=Y BUG=v8:3280 Review URL: https://codereview.chromium.org/246733003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20883 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/scopes.cc | 2 +- test/mjsunit/regress/regress-3280.js | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/mjsunit/regress/regress-3280.js diff --git a/src/scopes.cc b/src/scopes.cc index 4c4729e..833198c 100644 --- a/src/scopes.cc +++ b/src/scopes.cc @@ -1266,7 +1266,7 @@ void Scope::AllocateParameterLocals() { for (int i = params_.length() - 1; i >= 0; --i) { Variable* var = params_[i]; ASSERT(var->scope() == this); - if (uses_sloppy_arguments) { + if (uses_sloppy_arguments || has_forced_context_allocation()) { // Force context allocation of the parameter. var->ForceContextAllocation(); } diff --git a/test/mjsunit/regress/regress-3280.js b/test/mjsunit/regress/regress-3280.js new file mode 100644 index 0000000..2fc72cc --- /dev/null +++ b/test/mjsunit/regress/regress-3280.js @@ -0,0 +1,25 @@ +// 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-generators --expose-debug-as debug + +var Debug = debug.Debug; + +var listener_called; + +function listener(event, exec_state, event_data, data) { + if (event == Debug.DebugEvent.Break) { + listener_called = true; + exec_state.frame().allScopes(); + } +} + +Debug.setListener(listener); + +function *generator_local_2(a) { + debugger; +} +generator_local_2(1).next(); + +assertTrue(listener_called, "listener not called"); -- 2.7.4