Chromium Code Reviews| Index: src/parser.cc | 
| diff --git a/src/parser.cc b/src/parser.cc | 
| index b8855fd8f0ac1c0d267a0c2c583ebd52bec9b892..46e7fc6728d6afa7b04b18ddc306b3690af2a443 100644 | 
| --- a/src/parser.cc | 
| +++ b/src/parser.cc | 
| @@ -678,8 +678,9 @@ const AstString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 
| Expression* ParserTraits::ThisExpression( | 
| Scope* scope, | 
| - AstNodeFactory<AstConstructionVisitor>* factory) { | 
| - return factory->NewVariableProxy(scope->receiver()); | 
| + AstNodeFactory<AstConstructionVisitor>* factory, | 
| + int pos) { | 
| + return factory->NewVariableProxy(scope->receiver(), pos); | 
| } | 
| @@ -782,6 +783,7 @@ Parser::Parser(CompilationInfo* info) | 
| set_allow_lazy(false); // Must be explicitly enabled. | 
| set_allow_generators(FLAG_harmony_generators); | 
| set_allow_for_of(FLAG_harmony_iteration); | 
| + set_allow_arrow_functions(FLAG_harmony_arrow_functions); | 
| set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); | 
| } | 
| @@ -3296,6 +3298,66 @@ Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { | 
| } | 
| +Vector<VariableProxy*> ParserTraits::ParameterListFromExpression( | 
| + Expression* expression, bool* ok) { | 
| + | 
| + // Parsing the parameter list of an arrow function does not have parameters | 
| + // (as in: () => ...) returns NULL, so expression being NULL is not an error, | 
| + // but an valid empty parameter list. | 
| + if (expression == NULL) | 
| + return Vector<VariableProxy*>::empty(); | 
| + | 
| + const char* error_token = NULL; | 
| + Collector<VariableProxy*> collector; | 
| + | 
| + while (expression->IsBinaryOperation()) { | 
| + BinaryOperation* binop = expression->AsBinaryOperation(); | 
| + | 
| + if (binop->op() != Token::COMMA) { | 
| + error_token = Token::String(expression->AsBinaryOperation()->op()); | 
| + break; | 
| + } | 
| + | 
| + expression = binop->right(); | 
| + if (!expression->IsVariableProxy()) { | 
| + error_token = ""; | 
| 
 
marja
2014/06/17 11:47:37
In this case, don't we get an incorrect error end
 
 | 
| + break; | 
| + } | 
| + if (expression->AsVariableProxy()->is_this()) { | 
| + error_token = Token::String(Token::THIS); | 
| + break; | 
| + } | 
| + | 
| + collector.Add(expression->AsVariableProxy()); | 
| + expression = binop->left(); | 
| + } | 
| + | 
| + // No errors were found in the loop above, try to add the remaining item. | 
| + if (error_token == NULL) { | 
| + if (!expression->IsVariableProxy()) { | 
| + error_token = ""; | 
| + } else if (expression->AsVariableProxy()->is_this()) { | 
| + error_token = Token::String(Token::THIS); | 
| + } else { | 
| + collector.Add(expression->AsVariableProxy()); | 
| + return collector.ToVector(); | 
| + } | 
| + } | 
| + | 
| + // Report errors. | 
| + ASSERT_NE(error_token, NULL); | 
| + int error_pos = expression->position(); | 
| + int error_token_len = strlen(error_token); | 
| + ParserTraits::ReportMessageAt( | 
| + Scanner::Location(error_pos, | 
| + error_pos + error_token_len ? error_token_len : 1), | 
| + "unexpected_token", | 
| + error_token); | 
| + *ok = false; | 
| + return Vector<VariableProxy*>::empty(); | 
| +} | 
| + | 
| + | 
| FunctionLiteral* Parser::ParseFunctionLiteral( | 
| const AstString* function_name, | 
| Scanner::Location function_name_location, | 
| @@ -3506,34 +3568,15 @@ FunctionLiteral* Parser::ParseFunctionLiteral( | 
| handler_count = function_state.handler_count(); | 
| } | 
| - // Validate strict mode. We can do this only after parsing the function, | 
| - // since the function can declare itself strict. | 
| + // Validate strict mode. | 
| if (strict_mode() == STRICT) { | 
| - if (IsEvalOrArguments(function_name)) { | 
| - ReportMessageAt(function_name_location, "strict_eval_arguments"); | 
| - *ok = false; | 
| - return NULL; | 
| - } | 
| - if (name_is_strict_reserved) { | 
| - ReportMessageAt(function_name_location, "unexpected_strict_reserved"); | 
| - *ok = false; | 
| - return NULL; | 
| - } | 
| - if (eval_args_error_log.IsValid()) { | 
| - ReportMessageAt(eval_args_error_log, "strict_eval_arguments"); | 
| - *ok = false; | 
| - return NULL; | 
| - } | 
| - if (dupe_error_loc.IsValid()) { | 
| - ReportMessageAt(dupe_error_loc, "strict_param_dupe"); | 
| - *ok = false; | 
| - return NULL; | 
| - } | 
| - if (reserved_loc.IsValid()) { | 
| - ReportMessageAt(reserved_loc, "unexpected_strict_reserved"); | 
| - *ok = false; | 
| - return NULL; | 
| - } | 
| + CheckStrictFunctionNameAndParameters(function_name, | 
| + name_is_strict_reserved, | 
| + function_name_location, | 
| + eval_args_error_log, | 
| + dupe_error_loc, | 
| + reserved_loc, | 
| + CHECK_OK); | 
| CheckOctalLiteral(scope->start_position(), | 
| scope->end_position(), | 
| CHECK_OK); | 
| @@ -3724,6 +3767,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( | 
| reusable_preparser_->set_allow_lazy(true); | 
| reusable_preparser_->set_allow_generators(allow_generators()); | 
| reusable_preparser_->set_allow_for_of(allow_for_of()); | 
| + reusable_preparser_->set_allow_arrow_functions(allow_arrow_functions()); | 
| reusable_preparser_->set_allow_harmony_numeric_literals( | 
| allow_harmony_numeric_literals()); | 
| } |