Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 62c38aa57f3b6aa3e80e78baf7f99dc38d0c184f..c65d31f226f7ab4173aa73e04788d8e36eb5ed75 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -11224,22 +11224,23 @@ class ScopeIterator { |
return; |
} |
- // Check whether we are in global code or function code. If there is a stack |
- // slot for .result then this function has been created for evaluating |
- // global code and it is not a real function. |
- // Checking for the existence of .result seems fragile, but the scope info |
- // saved with the code object does not otherwise have that information. |
- int index = shared_info->scope_info()-> |
- StackSlotIndex(isolate_->heap()->result_symbol()); |
- |
// Reparse the code and analyze the scopes. |
ZoneScope zone_scope(isolate, DELETE_ON_EXIT); |
Handle<Script> script(Script::cast(shared_info->script())); |
Scope* scope; |
- if (index >= 0) { |
- // Global code |
+ |
+ // Check whether we are in global, eval or function code. |
+ Handle<ScopeInfo> scope_info(shared_info->scope_info()); |
+ if (scope_info->Type() != FUNCTION_SCOPE) { |
+ // Global or eval code. |
CompilationInfo info(script); |
- info.MarkAsGlobal(); |
+ if (scope_info->Type() == GLOBAL_SCOPE) { |
+ info.MarkAsGlobal(); |
+ } else { |
+ ASSERT(scope_info->Type() == EVAL_SCOPE); |
+ info.MarkAsEval(); |
+ info.SetCallingContext(Handle<Context>(function_->context())); |
+ } |
CHECK(ParserApi::Parse(&info)); |
CHECK(Scope::Analyze(&info)); |
scope = info.function()->scope(); |
@@ -11252,9 +11253,8 @@ class ScopeIterator { |
} |
// Retrieve the scope chain for the current position. |
- int statement_position = |
- shared_info->code()->SourceStatementPosition(frame_->pc()); |
- scope->GetNestedScopeChain(&nested_scope_chain_, statement_position); |
+ source_position_ = shared_info->code()->SourceStatementPosition(frame_->pc()); |
+ scope->GetNestedScopeChain(&nested_scope_chain_, source_position_); |
} |
// More scopes? |
@@ -11430,6 +11430,7 @@ class ScopeIterator { |
Handle<JSFunction> function_; |
Handle<Context> context_; |
List<Handle<ScopeInfo> > nested_scope_chain_; |
+ int source_position_; |
DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); |
}; |