| Index: src/contexts.cc
|
| diff --git a/src/contexts.cc b/src/contexts.cc
|
| index 30c474d5fff58fd8130f5bc00d58c89f78f1438c..537d92d0f4032cf5be4d6db03b850d9f8c6beeb7 100644
|
| --- a/src/contexts.cc
|
| +++ b/src/contexts.cc
|
| @@ -122,13 +122,30 @@ Handle<Object> Context::Lookup(Handle<String> name,
|
| PrintF(")\n");
|
| }
|
|
|
| + bool visited_global_context = false;
|
| +
|
| do {
|
| if (FLAG_trace_contexts) {
|
| PrintF(" - looking in context %p", reinterpret_cast<void*>(*context));
|
| + if (context->IsGlobalContext()) PrintF(" (global context)");
|
| if (context->IsNativeContext()) PrintF(" (native context)");
|
| PrintF("\n");
|
| }
|
|
|
| + if (follow_context_chain && FLAG_harmony_scoping &&
|
| + !visited_global_context &&
|
| + (context->IsGlobalContext() || context->IsNativeContext())) {
|
| + // For lexical scoping, on a top level, we might resolve to the
|
| + // lexical bindings introduced by later scrips. Therefore we need to
|
| + // switch to the the last added global context during lookup here.
|
| + context = Handle<Context>(context->global_object()->global_context());
|
| + visited_global_context = true;
|
| + if (FLAG_trace_contexts) {
|
| + PrintF(" - switching to current global context %p\n",
|
| + reinterpret_cast<void*>(*context));
|
| + }
|
| + }
|
| +
|
| // 1. Check global objects, subjects of with, and extension objects.
|
| if (context->IsNativeContext() ||
|
| context->IsWithContext() ||
|
| @@ -163,7 +180,8 @@ Handle<Object> Context::Lookup(Handle<String> name,
|
| }
|
|
|
| // 2. Check the context proper if it has slots.
|
| - if (context->IsFunctionContext() || context->IsBlockContext()) {
|
| + if (context->IsFunctionContext() || context->IsBlockContext() ||
|
| + (FLAG_harmony_scoping && context->IsGlobalContext())) {
|
| // Use serialized scope information of functions and blocks to search
|
| // for the context index.
|
| Handle<ScopeInfo> scope_info;
|
|
|