| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 2dbfeccdd628ab47be91cd6553cfc5d16968b03e..2a7d7805d162afccc2fc8270486ed5851a7275fe 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -1408,8 +1408,8 @@ Module* Parser::ParseModuleVariable(bool* ok) {
|
| PrintF("# Module variable %s ", name->ToAsciiArray());
|
| #endif
|
| VariableProxy* proxy = top_scope_->NewUnresolved(
|
| - factory(), name, scanner().location().beg_pos,
|
| - Interface::NewModule(zone()));
|
| + factory(), name, Interface::NewModule(zone()),
|
| + scanner().location().beg_pos);
|
|
|
| return factory()->NewModuleVariable(proxy);
|
| }
|
| @@ -1499,7 +1499,6 @@ Block* Parser::ParseImportDeclaration(bool* ok) {
|
| Declaration* declaration =
|
| factory()->NewImportDeclaration(proxy, module, top_scope_);
|
| Declare(declaration, true, CHECK_OK);
|
| - // TODO(rossberg): Add initialization statement to block.
|
| }
|
|
|
| return block;
|
| @@ -1740,7 +1739,7 @@ VariableProxy* Parser::NewUnresolved(
|
| // Let/const variables in harmony mode are always added to the immediately
|
| // enclosing scope.
|
| return DeclarationScope(mode)->NewUnresolved(
|
| - factory(), name, scanner().location().beg_pos, interface);
|
| + factory(), name, interface, scanner().location().beg_pos);
|
| }
|
|
|
|
|
| @@ -1954,7 +1953,7 @@ Statement* Parser::ParseNativeDeclaration(bool* ok) {
|
| // TODO(1240846): It's weird that native function declarations are
|
| // introduced dynamically when we meet their declarations, whereas
|
| // other functions are set up when entering the surrounding scope.
|
| - VariableProxy* proxy = NewUnresolved(name, VAR);
|
| + VariableProxy* proxy = NewUnresolved(name, VAR, Interface::NewValue());
|
| Declaration* declaration =
|
| factory()->NewVariableDeclaration(proxy, VAR, top_scope_);
|
| Declare(declaration, true, CHECK_OK);
|
| @@ -1983,7 +1982,7 @@ Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) {
|
| // scope, we treat is as such and introduce the function with it's
|
| // initial value upon entering the corresponding scope.
|
| VariableMode mode = is_extended_mode() ? LET : VAR;
|
| - VariableProxy* proxy = NewUnresolved(name, mode);
|
| + VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue());
|
| Declaration* declaration =
|
| factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_);
|
| Declare(declaration, true, CHECK_OK);
|
| @@ -2215,7 +2214,9 @@ Block* Parser::ParseVariableDeclarations(
|
| // For let/const declarations in harmony mode, we can also immediately
|
| // pre-resolve the proxy because it resides in the same scope as the
|
| // declaration.
|
| - VariableProxy* proxy = NewUnresolved(name, mode);
|
| + Interface* interface =
|
| + is_const ? Interface::NewConst() : Interface::NewValue();
|
| + VariableProxy* proxy = NewUnresolved(name, mode, interface);
|
| Declaration* declaration =
|
| factory()->NewVariableDeclaration(proxy, mode, top_scope_);
|
| Declare(declaration, mode != VAR, CHECK_OK);
|
| @@ -2376,7 +2377,7 @@ Block* Parser::ParseVariableDeclarations(
|
| // if they are inside a 'with' statement - they may change a 'with' object
|
| // property).
|
| VariableProxy* proxy =
|
| - initialization_scope->NewUnresolved(factory(), name);
|
| + initialization_scope->NewUnresolved(factory(), name, interface);
|
| Assignment* assignment =
|
| factory()->NewAssignment(init_op, proxy, value, position);
|
| block->AddStatement(factory()->NewExpressionStatement(assignment),
|
| @@ -2884,12 +2885,16 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| for_scope->set_start_position(scanner().location().beg_pos);
|
| if (peek() != Token::SEMICOLON) {
|
| if (peek() == Token::VAR || peek() == Token::CONST) {
|
| + bool is_const = peek() == Token::CONST;
|
| Handle<String> name;
|
| Block* variable_statement =
|
| ParseVariableDeclarations(kForStatement, NULL, NULL, &name, CHECK_OK);
|
|
|
| if (peek() == Token::IN && !name.is_null()) {
|
| - VariableProxy* each = top_scope_->NewUnresolved(factory(), name);
|
| + Interface* interface =
|
| + is_const ? Interface::NewConst() : Interface::NewValue();
|
| + VariableProxy* each =
|
| + top_scope_->NewUnresolved(factory(), name, interface);
|
| ForInStatement* loop = factory()->NewForInStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| @@ -2936,7 +2941,9 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| // implementing stack allocated block scoped variables.
|
| Variable* temp = top_scope_->DeclarationScope()->NewTemporary(name);
|
| VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
|
| - VariableProxy* each = top_scope_->NewUnresolved(factory(), name);
|
| + Interface* interface = Interface::NewValue();
|
| + VariableProxy* each =
|
| + top_scope_->NewUnresolved(factory(), name, interface);
|
| ForInStatement* loop = factory()->NewForInStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| @@ -3671,7 +3678,7 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) {
|
| #endif
|
| Interface* interface = Interface::NewUnknown(zone());
|
| result = top_scope_->NewUnresolved(
|
| - factory(), name, scanner().location().beg_pos, interface);
|
| + factory(), name, interface, scanner().location().beg_pos);
|
| break;
|
| }
|
|
|
| @@ -4517,7 +4524,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| 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);
|
| + Variable::NORMAL, kCreatedInitialized, Interface::NewConst());
|
| VariableProxy* proxy = factory()->NewVariableProxy(fvar);
|
| VariableDeclaration* fvar_declaration =
|
| factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_);
|
| @@ -4607,8 +4614,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| if (!is_lazily_compiled) {
|
| body = new(zone()) ZoneList<Statement*>(8, zone());
|
| if (fvar != NULL) {
|
| - VariableProxy* fproxy =
|
| - top_scope_->NewUnresolved(factory(), function_name);
|
| + VariableProxy* fproxy = top_scope_->NewUnresolved(
|
| + factory(), function_name, Interface::NewConst());
|
| fproxy->BindTo(fvar);
|
| body->Add(factory()->NewExpressionStatement(
|
| factory()->NewAssignment(fvar_init_op,
|
|
|