| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index db4e0fed2416554afc676609979d00e0317acf46..165c3bad6c4e5b2d19b1a340b6454a6b702a5d94 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -716,18 +716,16 @@ Expression* ParserTraits::ParseV8Intrinsic(bool* ok) {
|
|
|
|
|
| FunctionLiteral* ParserTraits::ParseFunctionLiteral(
|
| - const AstRawString* name,
|
| - Scanner::Location function_name_location,
|
| - bool name_is_strict_reserved,
|
| - bool is_generator,
|
| - int function_token_position,
|
| - FunctionLiteral::FunctionType type,
|
| - FunctionLiteral::ArityRestriction arity_restriction,
|
| - bool* ok) {
|
| - return parser_->ParseFunctionLiteral(name, function_name_location,
|
| - name_is_strict_reserved, is_generator,
|
| - function_token_position, type,
|
| - arity_restriction, ok);
|
| + const AstRawString* name, Scanner::Location function_name_location,
|
| + bool name_is_strict_reserved, FunctionLiteral::IsGeneratorFlag is_generator,
|
| + FunctionLiteral::IsArrowFlag is_arrow,
|
| + FunctionLiteral::IsConciseMethodFlag is_concise_method,
|
| + int function_token_position, FunctionLiteral::FunctionType type,
|
| + FunctionLiteral::ArityRestriction arity_restriction, bool* ok) {
|
| + return parser_->ParseFunctionLiteral(
|
| + name, function_name_location, name_is_strict_reserved, is_generator,
|
| + is_arrow, is_concise_method, function_token_position, type,
|
| + arity_restriction, ok);
|
| }
|
|
|
|
|
| @@ -758,6 +756,7 @@ Parser::Parser(CompilationInfo* info)
|
| set_allow_arrow_functions(FLAG_harmony_arrow_functions);
|
| set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
|
| set_allow_classes(FLAG_harmony_classes);
|
| + set_allow_harmony_object_literals(FLAG_harmony_object_literals);
|
| for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
|
| ++feature) {
|
| use_counts_[feature] = 0;
|
| @@ -898,8 +897,8 @@ FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info,
|
| function_state.handler_count(), 0,
|
| FunctionLiteral::kNoDuplicateParameters,
|
| FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval,
|
| - FunctionLiteral::kNotParenthesized, FunctionLiteral::kNormalFunction,
|
| - 0);
|
| + FunctionLiteral::kNotParenthesized, FunctionLiteral::kNotGenerator,
|
| + FunctionLiteral::kNotArrow, FunctionLiteral::kNotConciseMethod, 0);
|
| result->set_ast_properties(factory()->visitor()->ast_properties());
|
| result->set_dont_optimize_reason(
|
| factory()->visitor()->dont_optimize_reason());
|
| @@ -997,11 +996,16 @@ FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) {
|
| DCHECK(expression->IsFunctionLiteral());
|
| result = expression->AsFunctionLiteral();
|
| } else {
|
| - result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(),
|
| - false, // Strict mode name already checked.
|
| - is_generator, RelocInfo::kNoPosition,
|
| - function_type,
|
| - FunctionLiteral::NORMAL_ARITY, &ok);
|
| + result = ParseFunctionLiteral(
|
| + raw_name, Scanner::Location::invalid(),
|
| + false, // Strict mode name already checked.
|
| + is_generator ? FunctionLiteral::kIsGenerator
|
| + : FunctionLiteral::kNotGenerator,
|
| + FunctionLiteral::kNotArrow,
|
| + shared_info->is_concise_method() ? FunctionLiteral::kIsConciseMethod
|
| + : FunctionLiteral::kNotConciseMethod,
|
| + RelocInfo::kNoPosition, function_type, FunctionLiteral::NORMAL_ARITY,
|
| + &ok);
|
| }
|
| // Make sure the results agree.
|
| DCHECK(ok == (result != NULL));
|
| @@ -1890,14 +1894,12 @@ Statement* Parser::ParseFunctionDeclaration(
|
| bool is_strict_reserved = false;
|
| const AstRawString* name = ParseIdentifierOrStrictReservedWord(
|
| &is_strict_reserved, CHECK_OK);
|
| - FunctionLiteral* fun = ParseFunctionLiteral(name,
|
| - scanner()->location(),
|
| - is_strict_reserved,
|
| - is_generator,
|
| - pos,
|
| - FunctionLiteral::DECLARATION,
|
| - FunctionLiteral::NORMAL_ARITY,
|
| - CHECK_OK);
|
| + FunctionLiteral* fun = ParseFunctionLiteral(
|
| + name, scanner()->location(), is_strict_reserved,
|
| + is_generator ? FunctionLiteral::kIsGenerator
|
| + : FunctionLiteral::kNotGenerator,
|
| + FunctionLiteral::kNotArrow, FunctionLiteral::kNotConciseMethod, pos,
|
| + FunctionLiteral::DECLARATION, FunctionLiteral::NORMAL_ARITY, CHECK_OK);
|
| // Even if we're not at the top-level of the global or a function
|
| // scope, we treat it as such and introduce the function with its
|
| // initial value upon entering the corresponding scope.
|
| @@ -3361,14 +3363,12 @@ int ParserTraits::DeclareArrowParametersFromExpression(
|
|
|
|
|
| FunctionLiteral* Parser::ParseFunctionLiteral(
|
| - const AstRawString* function_name,
|
| - Scanner::Location function_name_location,
|
| - bool name_is_strict_reserved,
|
| - bool is_generator,
|
| - int function_token_pos,
|
| - FunctionLiteral::FunctionType function_type,
|
| - FunctionLiteral::ArityRestriction arity_restriction,
|
| - bool* ok) {
|
| + const AstRawString* function_name, Scanner::Location function_name_location,
|
| + bool name_is_strict_reserved, FunctionLiteral::IsGeneratorFlag is_generator,
|
| + FunctionLiteral::IsArrowFlag is_arrow,
|
| + FunctionLiteral::IsConciseMethodFlag is_concise_method,
|
| + int function_token_pos, FunctionLiteral::FunctionType function_type,
|
| + FunctionLiteral::ArityRestriction arity_restriction, bool* ok) {
|
| // Function ::
|
| // '(' FormalParameterList? ')' '{' FunctionBody '}'
|
| //
|
| @@ -3589,7 +3589,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| }
|
|
|
| // Validate strict mode.
|
| - if (strict_mode() == STRICT) {
|
| + // Concise methods use StrictFormalParameters.
|
| + if (strict_mode() == STRICT || is_concise_method) {
|
| CheckStrictFunctionNameAndParameters(function_name,
|
| name_is_strict_reserved,
|
| function_name_location,
|
| @@ -3597,6 +3598,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| dupe_error_loc,
|
| reserved_loc,
|
| CHECK_OK);
|
| + }
|
| + if (strict_mode() == STRICT) {
|
| CheckOctalLiteral(scope->start_position(),
|
| scope->end_position(),
|
| CHECK_OK);
|
| @@ -3609,14 +3612,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| }
|
| }
|
|
|
| - FunctionLiteral::KindFlag kind = is_generator
|
| - ? FunctionLiteral::kGeneratorFunction
|
| - : FunctionLiteral::kNormalFunction;
|
| FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
|
| function_name, ast_value_factory_, scope, body,
|
| materialized_literal_count, expected_property_count, handler_count,
|
| num_parameters, duplicate_parameters, function_type,
|
| - FunctionLiteral::kIsFunction, parenthesized, kind, pos);
|
| + FunctionLiteral::kIsFunction, parenthesized, is_generator, is_arrow,
|
| + is_concise_method, pos);
|
| function_literal->set_function_token_position(function_token_pos);
|
| function_literal->set_ast_properties(&ast_properties);
|
| function_literal->set_dont_optimize_reason(dont_optimize_reason);
|
| @@ -3770,6 +3771,8 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
|
| reusable_preparser_->set_allow_harmony_numeric_literals(
|
| allow_harmony_numeric_literals());
|
| reusable_preparser_->set_allow_classes(allow_classes());
|
| + reusable_preparser_->set_allow_harmony_object_literals(
|
| + allow_harmony_object_literals());
|
| }
|
| PreParser::PreParseResult result =
|
| reusable_preparser_->PreParseLazyFunction(strict_mode(),
|
|
|