| Index: src/parser.cc
 | 
| ===================================================================
 | 
| --- src/parser.cc	(revision 11348)
 | 
| +++ src/parser.cc	(working copy)
 | 
| @@ -1333,11 +1333,19 @@
 | 
|  
 | 
|    Expect(Token::RBRACE, CHECK_OK);
 | 
|    scope->set_end_position(scanner().location().end_pos);
 | 
| -  body->set_block_scope(scope);
 | 
| +  body->set_scope(scope);
 | 
|  
 | 
| -  scope->interface()->Freeze(ok);
 | 
| +  // Instance objects have to be created ahead of time (before code generation
 | 
| +  // linking them) because of potentially cyclic references between them.
 | 
| +  // We create them here, to avoid another pass over the AST.
 | 
| +  Interface* interface = scope->interface();
 | 
| +  interface->MakeModule(ok);
 | 
|    ASSERT(ok);
 | 
| -  return factory()->NewModuleLiteral(body, scope->interface());
 | 
| +  interface->MakeSingleton(Isolate::Current()->factory()->NewJSModule(), ok);
 | 
| +  ASSERT(ok);
 | 
| +  interface->Freeze(ok);
 | 
| +  ASSERT(ok);
 | 
| +  return factory()->NewModuleLiteral(body, interface);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1403,7 +1411,14 @@
 | 
|  #ifdef DEBUG
 | 
|    if (FLAG_print_interface_details) PrintF("# Url ");
 | 
|  #endif
 | 
| -  return factory()->NewModuleUrl(symbol);
 | 
| +
 | 
| +  Module* result = factory()->NewModuleUrl(symbol);
 | 
| +  Interface* interface = result->interface();
 | 
| +  interface->MakeSingleton(Isolate::Current()->factory()->NewJSModule(), ok);
 | 
| +  ASSERT(ok);
 | 
| +  interface->Freeze(ok);
 | 
| +  ASSERT(ok);
 | 
| +  return result;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2015,7 +2030,7 @@
 | 
|    Expect(Token::RBRACE, CHECK_OK);
 | 
|    block_scope->set_end_position(scanner().location().end_pos);
 | 
|    block_scope = block_scope->FinalizeBlockScope();
 | 
| -  body->set_block_scope(block_scope);
 | 
| +  body->set_scope(block_scope);
 | 
|    return body;
 | 
|  }
 | 
|  
 | 
| @@ -2254,7 +2269,7 @@
 | 
|      // Global variable declarations must be compiled in a specific
 | 
|      // way. When the script containing the global variable declaration
 | 
|      // is entered, the global variable must be declared, so that if it
 | 
| -    // doesn't exist (not even in a prototype of the global object) it
 | 
| +    // doesn't exist (on the global object itself, see ES5 errata) it
 | 
|      // gets created with an initial undefined value. This is handled
 | 
|      // by the declarations part of the function representing the
 | 
|      // top-level global code; see Runtime::DeclareGlobalVariable. If
 | 
| @@ -2917,7 +2932,7 @@
 | 
|          top_scope_ = saved_scope;
 | 
|          for_scope->set_end_position(scanner().location().end_pos);
 | 
|          for_scope = for_scope->FinalizeBlockScope();
 | 
| -        body_block->set_block_scope(for_scope);
 | 
| +        body_block->set_scope(for_scope);
 | 
|          // Parsed for-in loop w/ let declaration.
 | 
|          return loop;
 | 
|  
 | 
| @@ -2997,7 +3012,7 @@
 | 
|      Block* result = factory()->NewBlock(NULL, 2, false);
 | 
|      result->AddStatement(init);
 | 
|      result->AddStatement(loop);
 | 
| -    result->set_block_scope(for_scope);
 | 
| +    result->set_scope(for_scope);
 | 
|      if (loop) loop->Initialize(NULL, cond, next, body);
 | 
|      return result;
 | 
|    } else {
 | 
| @@ -4460,15 +4475,15 @@
 | 
|      Variable* fvar = NULL;
 | 
|      Token::Value fvar_init_op = Token::INIT_CONST;
 | 
|      if (type == FunctionLiteral::NAMED_EXPRESSION) {
 | 
| -      VariableMode fvar_mode;
 | 
| -      if (is_extended_mode()) {
 | 
| -        fvar_mode = CONST_HARMONY;
 | 
| -        fvar_init_op = Token::INIT_CONST_HARMONY;
 | 
| -      } else {
 | 
| -        fvar_mode = CONST;
 | 
| -      }
 | 
| -      fvar =
 | 
| -          top_scope_->DeclareFunctionVar(function_name, fvar_mode, factory());
 | 
| +      if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY;
 | 
| +      VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST;
 | 
| +      fvar = new(zone()) Variable(top_scope_,
 | 
| +         function_name, fvar_mode, true /* is valid LHS */,
 | 
| +         Variable::NORMAL, kCreatedInitialized);
 | 
| +      VariableProxy* proxy = factory()->NewVariableProxy(fvar);
 | 
| +      VariableDeclaration* fvar_declaration =
 | 
| +          factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_);
 | 
| +      top_scope_->DeclareFunctionVar(fvar_declaration);
 | 
|      }
 | 
|  
 | 
|      // Determine whether the function will be lazily compiled.
 | 
| 
 |