Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index dff7de9e6b25c9c9370c866ab5bd4f52646852a6..0c0fe36f1b9635a772a0251ade4a29dfdf0afbd8 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -723,7 +723,14 @@ Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, |
PrintF("# Variable %.*s ", name->length(), name->raw_data()); |
#endif |
Interface* interface = Interface::NewUnknown(parser_->zone()); |
- return scope->NewUnresolved(factory, name, interface, pos); |
+ |
+ // Arrow function parameters are parsed as an expression. When |
+ // parsing lazily, it is enough to create a VariableProxy in order |
+ // for Traits::DeclareArrowParametersFromExpression() to be able to |
+ // pick the names of the parameters. |
+ return parser_->parsing_lazy_arrow_parameters_ |
+ ? factory->NewVariableProxy(name, false, interface, pos) |
+ : scope->NewUnresolved(factory, name, interface, pos); |
} |
@@ -788,6 +795,7 @@ Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) |
target_stack_(NULL), |
cached_parse_data_(NULL), |
info_(info), |
+ parsing_lazy_arrow_parameters_(false), |
has_pending_error_(false), |
pending_error_message_(NULL), |
pending_error_arg_(NULL), |
@@ -1061,6 +1069,10 @@ FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) { |
bool ok = true; |
if (shared_info->is_arrow()) { |
+ // The first expression being parsed is the parameter list of the arrow |
+ // function. Setting this avoids prevents ExpressionFromIdentifier() |
+ // from creating unresolved variables in already-resolved scopes. |
+ parsing_lazy_arrow_parameters_ = true; |
Expression* expression = ParseExpression(false, &ok); |
DCHECK(expression->IsFunctionLiteral()); |
result = expression->AsFunctionLiteral(); |
marja
2015/01/29 09:53:01
Why are setting parsing_lazy_arrow_parameters_ to
aperez
2015/01/29 14:38:03
That does not work.
ParseExpression() here parses
|
@@ -3341,6 +3353,10 @@ int ParserTraits::DeclareArrowParametersFromExpression( |
Expression* expression, Scope* scope, Scanner::Location* dupe_loc, |
bool* ok) { |
int num_params = 0; |
+ // Always reset the flag: It only needs to be set for the first expression |
+ // parsed as arrow function parameter list, becauseonly top-level functions |
+ // are parsed lazily. |
+ parser_->parsing_lazy_arrow_parameters_ = false; |
*ok = CheckAndDeclareArrowParameter(this, expression, scope, &num_params, |
dupe_loc); |
return num_params; |