From c2e7beb9528ebd38992dd7c2695f689d260992ec Mon Sep 17 00:00:00 2001 From: "yurys@chromium.org" Date: Wed, 6 Apr 2011 17:54:39 +0000 Subject: [PATCH] Debugger: show local scope before with for functions created inside with block Review URL: http://codereview.chromium.org/6804015 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7518 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/runtime.cc | 4 ++ test/mjsunit/debug-scopes.js | 116 +++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/src/runtime.cc b/src/runtime.cc index 2a58e76c9..a1d707678 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -9820,6 +9820,10 @@ class ScopeIterator { at_local_ = index < 0; } else if (context_->is_function_context()) { at_local_ = true; + } else if (context_->closure() != *function_) { + // The context_ is a with block from the outer function. + ASSERT(context_->has_extension()); + at_local_ = true; } } diff --git a/test/mjsunit/debug-scopes.js b/test/mjsunit/debug-scopes.js index 37cefd1a9..674f2da0f 100644 --- a/test/mjsunit/debug-scopes.js +++ b/test/mjsunit/debug-scopes.js @@ -144,6 +144,10 @@ function CheckScopeContent(content, number, exec_state) { if (!scope.scopeObject().property('.catch-var').isUndefined()) { scope_size--; } + // Skip property with empty name. + if (!scope.scopeObject().property('').isUndefined()) { + scope_size--; + } if (count != scope_size) { print('Names found in scope:'); @@ -607,6 +611,43 @@ closure_7(1, 2)() EndTest(); +// Closure that may be optimized out. +BeginTest("Closure 8"); +function closure_8() { + (function inner(x) { + debugger; + })(2); +} + +listener_delegate = function(exec_state) { + CheckScopeChain([debug.ScopeType.Local, + debug.ScopeType.Global], exec_state); + CheckScopeContent({x: 2}, 0, exec_state); +} +closure_8(); +EndTest(); + + +BeginTest("Closure 9"); +function closure_9() { + eval("var y = 1;"); + eval("var z = 1;"); + (function inner(x) { + y++; + z++; + debugger; + })(2); +} + +listener_delegate = function(exec_state) { + CheckScopeChain([debug.ScopeType.Local, + debug.ScopeType.Closure, + debug.ScopeType.Global], exec_state); +} +closure_9(); +EndTest(); + + // Test a mixture of scopes. BeginTest("The full monty"); function the_full_monty(a, b) { @@ -653,6 +694,81 @@ listener_delegate = function(exec_state) { the_full_monty(1, 2)() EndTest(); + +BeginTest("Closure inside With 1"); +function closure_in_with_1() { + with({x:1}) { + (function inner(x) { + debugger; + })(2); + } +} + +listener_delegate = function(exec_state) { + CheckScopeChain([debug.ScopeType.Local, + debug.ScopeType.With, + debug.ScopeType.Closure, + debug.ScopeType.Global], exec_state); + CheckScopeContent({x: 2}, 0, exec_state); +} +closure_in_with_1(); +EndTest(); + + +BeginTest("Closure inside With 2"); +function closure_in_with_2() { + with({x:1}) { + (function inner(x) { + with({x:3}) { + debugger; + } + })(2); + } +} + +listener_delegate = function(exec_state) { + CheckScopeChain([debug.ScopeType.With, + debug.ScopeType.Local, + debug.ScopeType.With, + debug.ScopeType.Closure, + debug.ScopeType.Global], exec_state); + CheckScopeContent({x: 3}, 0, exec_state); + CheckScopeContent({x: 2}, 1, exec_state); + CheckScopeContent({x: 1}, 2, exec_state); +} +closure_in_with_2(); +EndTest(); + + +BeginTest("Closure inside With 3"); +function createClosure(a) { + var b = a + 1; + return function closure() { + var c = b; + (function inner(x) { + with({x:c}) { + debugger; + } + })(2); + } +} + +function closure_in_with_3() { + var f = createClosure(0); + f(); +} + +listener_delegate = function(exec_state) { + CheckScopeChain([debug.ScopeType.With, + debug.ScopeType.Local, + debug.ScopeType.Closure, + debug.ScopeType.Closure, + debug.ScopeType.Global], exec_state); +} +closure_in_with_3(); +EndTest(); + + // Test global scope. BeginTest("Global"); listener_delegate = function(exec_state) { -- 2.34.1