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. |