| Index: src/debug/debug-scopes.cc
|
| diff --git a/src/debug/debug-scopes.cc b/src/debug/debug-scopes.cc
|
| index ce9cac2046cd2c7879959c7b9831ed13763773ed..0bf872a92293e6594ae497f60290db16d6c84a22 100644
|
| --- a/src/debug/debug-scopes.cc
|
| +++ b/src/debug/debug-scopes.cc
|
| @@ -13,6 +13,7 @@
|
| #include "src/globals.h"
|
| #include "src/isolate-inl.h"
|
| #include "src/parsing/parser.h"
|
| +#include "src/parsing/rewriter.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -107,10 +108,26 @@ ScopeIterator::ScopeIterator(Isolate* isolate, FrameInspector* frame_inspector,
|
| // Inner function.
|
| info.reset(new ParseInfo(&zone, function));
|
| }
|
| - Scope* scope = NULL;
|
| - if (Compiler::ParseAndAnalyze(info.get())) scope = info->literal()->scope();
|
| - if (!ignore_nested_scopes) RetrieveScopeChain(scope);
|
| - if (collect_non_locals) CollectNonLocals(scope);
|
| + if (Parser::ParseStatic(info.get()) && Rewriter::Rewrite(info.get())) {
|
| + DeclarationScope* scope = info->literal()->scope();
|
| + if (!ignore_nested_scopes || collect_non_locals) {
|
| + CollectNonLocals(info.get(), scope);
|
| + }
|
| + if (!ignore_nested_scopes) {
|
| + AstNodeFactory ast_node_factory(info.get()->ast_value_factory());
|
| + scope->AllocateVariables(info.get(), &ast_node_factory);
|
| + RetrieveScopeChain(scope);
|
| + }
|
| + } else if (!ignore_nested_scopes) {
|
| + // A failed reparse indicates that the preparser has diverged from the
|
| + // parser or that the preparse data given to the initial parse has been
|
| + // faulty. We fail in debug mode but in release mode we only provide the
|
| + // information we get from the context chain but nothing about
|
| + // completely stack allocated scopes or stack allocated locals.
|
| + // Or it could be due to stack overflow.
|
| + DCHECK(isolate_->has_pending_exception());
|
| + failed_ = true;
|
| + }
|
| UnwrapEvaluationContext();
|
| }
|
|
|
| @@ -431,29 +448,16 @@ void ScopeIterator::DebugPrint() {
|
| }
|
| #endif
|
|
|
| -
|
| -void ScopeIterator::RetrieveScopeChain(Scope* scope) {
|
| - if (scope != NULL) {
|
| - int source_position = frame_inspector_->GetSourcePosition();
|
| - GetNestedScopeChain(isolate_, scope, source_position);
|
| - } else {
|
| - // A failed reparse indicates that the preparser has diverged from the
|
| - // parser or that the preparse data given to the initial parse has been
|
| - // faulty. We fail in debug mode but in release mode we only provide the
|
| - // information we get from the context chain but nothing about
|
| - // completely stack allocated scopes or stack allocated locals.
|
| - // Or it could be due to stack overflow.
|
| - DCHECK(isolate_->has_pending_exception());
|
| - failed_ = true;
|
| - }
|
| +void ScopeIterator::RetrieveScopeChain(DeclarationScope* scope) {
|
| + DCHECK_NOT_NULL(scope);
|
| + int source_position = frame_inspector_->GetSourcePosition();
|
| + GetNestedScopeChain(isolate_, scope, source_position);
|
| }
|
|
|
| -
|
| -void ScopeIterator::CollectNonLocals(Scope* scope) {
|
| - if (scope != NULL) {
|
| - DCHECK(non_locals_.is_null());
|
| - non_locals_ = scope->CollectNonLocals(StringSet::New(isolate_));
|
| - }
|
| +void ScopeIterator::CollectNonLocals(ParseInfo* info, DeclarationScope* scope) {
|
| + DCHECK_NOT_NULL(scope);
|
| + DCHECK(non_locals_.is_null());
|
| + non_locals_ = scope->CollectNonLocals(info, StringSet::New(isolate_));
|
| }
|
|
|
|
|
|
|