| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 5bce764a399148cdffe4c285645baec8b4fdfd51..862051956be333845936783c6e2aaafbb2ac822e 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -1333,11 +1333,19 @@ Module* Parser::ParseModuleLiteral(bool* ok) {
|
|
|
| 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 @@ Module* Parser::ParseModuleUrl(bool* ok) {
|
| #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 @@ Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) {
|
| 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;
|
| }
|
|
|
| @@ -2917,7 +2932,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| 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 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| 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 {
|
|
|