OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <cmath> | 5 #include <cmath> |
6 | 6 |
7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 | 87 |
88 PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) { | 88 PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) { |
89 return pre_parser_->ParseV8Intrinsic(ok); | 89 return pre_parser_->ParseV8Intrinsic(ok); |
90 } | 90 } |
91 | 91 |
92 | 92 |
93 PreParserExpression PreParserTraits::ParseFunctionLiteral( | 93 PreParserExpression PreParserTraits::ParseFunctionLiteral( |
94 PreParserIdentifier name, Scanner::Location function_name_location, | 94 PreParserIdentifier name, Scanner::Location function_name_location, |
95 FunctionNameValidity function_name_validity, FunctionKind kind, | 95 FunctionNameValidity function_name_validity, FunctionKind kind, |
96 int function_token_position, FunctionLiteral::FunctionType type, | 96 int function_token_position, FunctionLiteral::FunctionType type, |
97 FunctionLiteral::ArityRestriction arity_restriction, | |
98 LanguageMode language_mode, bool* ok) { | 97 LanguageMode language_mode, bool* ok) { |
99 return pre_parser_->ParseFunctionLiteral( | 98 return pre_parser_->ParseFunctionLiteral( |
100 name, function_name_location, function_name_validity, kind, | 99 name, function_name_location, function_name_validity, kind, |
101 function_token_position, type, arity_restriction, language_mode, ok); | 100 function_token_position, type, language_mode, ok); |
102 } | 101 } |
103 | 102 |
104 | 103 |
105 PreParser::PreParseResult PreParser::PreParseLazyFunction( | 104 PreParser::PreParseResult PreParser::PreParseLazyFunction( |
106 LanguageMode language_mode, FunctionKind kind, bool has_simple_parameters, | 105 LanguageMode language_mode, FunctionKind kind, bool has_simple_parameters, |
107 ParserRecorder* log, Scanner::BookmarkScope* bookmark) { | 106 ParserRecorder* log, Scanner::BookmarkScope* bookmark) { |
108 log_ = log; | 107 log_ = log; |
109 // Lazy functions always have trivial outer scopes (no with/catch scopes). | 108 // Lazy functions always have trivial outer scopes (no with/catch scopes). |
110 Scope* top_scope = NewScope(scope_, SCRIPT_SCOPE); | 109 Scope* top_scope = NewScope(scope_, SCRIPT_SCOPE); |
111 PreParserFactory top_factory(NULL); | 110 PreParserFactory top_factory(NULL); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 int pos = position(); | 443 int pos = position(); |
445 bool is_generator = Check(Token::MUL); | 444 bool is_generator = Check(Token::MUL); |
446 bool is_strict_reserved = false; | 445 bool is_strict_reserved = false; |
447 Identifier name = ParseIdentifierOrStrictReservedWord( | 446 Identifier name = ParseIdentifierOrStrictReservedWord( |
448 &is_strict_reserved, CHECK_OK); | 447 &is_strict_reserved, CHECK_OK); |
449 ParseFunctionLiteral(name, scanner()->location(), | 448 ParseFunctionLiteral(name, scanner()->location(), |
450 is_strict_reserved ? kFunctionNameIsStrictReserved | 449 is_strict_reserved ? kFunctionNameIsStrictReserved |
451 : kFunctionNameValidityUnknown, | 450 : kFunctionNameValidityUnknown, |
452 is_generator ? FunctionKind::kGeneratorFunction | 451 is_generator ? FunctionKind::kGeneratorFunction |
453 : FunctionKind::kNormalFunction, | 452 : FunctionKind::kNormalFunction, |
454 pos, FunctionLiteral::kDeclaration, | 453 pos, FunctionLiteral::kDeclaration, language_mode(), |
455 FunctionLiteral::kNormalArity, language_mode(), | |
456 CHECK_OK); | 454 CHECK_OK); |
457 return Statement::FunctionDeclaration(); | 455 return Statement::FunctionDeclaration(); |
458 } | 456 } |
459 | 457 |
460 | 458 |
461 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { | 459 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { |
462 Expect(Token::CLASS, CHECK_OK); | 460 Expect(Token::CLASS, CHECK_OK); |
463 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { | 461 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { |
464 ReportMessage(MessageTemplate::kSloppyLexical); | 462 ReportMessage(MessageTemplate::kSloppyLexical); |
465 *ok = false; | 463 *ok = false; |
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 if (!*ok) return Expression::Default(); \ | 1095 if (!*ok) return Expression::Default(); \ |
1098 ((void)0 | 1096 ((void)0 |
1099 #define DUMMY ) // to make indentation work | 1097 #define DUMMY ) // to make indentation work |
1100 #undef DUMMY | 1098 #undef DUMMY |
1101 | 1099 |
1102 | 1100 |
1103 PreParser::Expression PreParser::ParseFunctionLiteral( | 1101 PreParser::Expression PreParser::ParseFunctionLiteral( |
1104 Identifier function_name, Scanner::Location function_name_location, | 1102 Identifier function_name, Scanner::Location function_name_location, |
1105 FunctionNameValidity function_name_validity, FunctionKind kind, | 1103 FunctionNameValidity function_name_validity, FunctionKind kind, |
1106 int function_token_pos, FunctionLiteral::FunctionType function_type, | 1104 int function_token_pos, FunctionLiteral::FunctionType function_type, |
1107 FunctionLiteral::ArityRestriction arity_restriction, | |
1108 LanguageMode language_mode, bool* ok) { | 1105 LanguageMode language_mode, bool* ok) { |
1109 // Function :: | 1106 // Function :: |
1110 // '(' FormalParameterList? ')' '{' FunctionBody '}' | 1107 // '(' FormalParameterList? ')' '{' FunctionBody '}' |
1111 | 1108 |
1112 // Parse function body. | 1109 // Parse function body. |
1113 bool outer_is_script_scope = scope_->is_script_scope(); | 1110 bool outer_is_script_scope = scope_->is_script_scope(); |
1114 Scope* function_scope = NewScope(scope_, FUNCTION_SCOPE, kind); | 1111 Scope* function_scope = NewScope(scope_, FUNCTION_SCOPE, kind); |
1115 function_scope->SetLanguageMode(language_mode); | 1112 function_scope->SetLanguageMode(language_mode); |
1116 PreParserFactory factory(NULL); | 1113 PreParserFactory factory(NULL); |
1117 FunctionState function_state(&function_state_, &scope_, function_scope, kind, | 1114 FunctionState function_state(&function_state_, &scope_, function_scope, kind, |
1118 &factory); | 1115 &factory); |
1119 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); | 1116 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
1120 ExpressionClassifier formals_classifier(&duplicate_finder); | 1117 ExpressionClassifier formals_classifier(&duplicate_finder); |
1121 | 1118 |
1122 Expect(Token::LPAREN, CHECK_OK); | 1119 Expect(Token::LPAREN, CHECK_OK); |
1123 int start_position = scanner()->location().beg_pos; | 1120 int start_position = scanner()->location().beg_pos; |
1124 function_scope->set_start_position(start_position); | 1121 function_scope->set_start_position(start_position); |
1125 PreParserFormalParameters formals(function_scope); | 1122 PreParserFormalParameters formals(function_scope); |
1126 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); | 1123 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); |
1127 Expect(Token::RPAREN, CHECK_OK); | 1124 Expect(Token::RPAREN, CHECK_OK); |
1128 int formals_end_position = scanner()->location().end_pos; | 1125 int formals_end_position = scanner()->location().end_pos; |
1129 | 1126 |
1130 CheckArityRestrictions(formals.arity, arity_restriction, | 1127 CheckArityRestrictions(formals.arity, kind, formals.has_rest, start_position, |
1131 formals.has_rest, start_position, | |
1132 formals_end_position, CHECK_OK); | 1128 formals_end_position, CHECK_OK); |
1133 | 1129 |
1134 // See Parser::ParseFunctionLiteral for more information about lazy parsing | 1130 // See Parser::ParseFunctionLiteral for more information about lazy parsing |
1135 // and lazy compilation. | 1131 // and lazy compilation. |
1136 bool is_lazily_parsed = | 1132 bool is_lazily_parsed = |
1137 (outer_is_script_scope && allow_lazy() && !parenthesized_function_); | 1133 (outer_is_script_scope && allow_lazy() && !parenthesized_function_); |
1138 parenthesized_function_ = false; | 1134 parenthesized_function_ = false; |
1139 | 1135 |
1140 Expect(Token::LBRACE, CHECK_OK); | 1136 Expect(Token::LBRACE, CHECK_OK); |
1141 if (is_lazily_parsed) { | 1137 if (is_lazily_parsed) { |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 Expect(Token::RBRACE, CHECK_OK); | 1284 Expect(Token::RBRACE, CHECK_OK); |
1289 return PreParserExpression::Default(); | 1285 return PreParserExpression::Default(); |
1290 } | 1286 } |
1291 } | 1287 } |
1292 | 1288 |
1293 #undef CHECK_OK | 1289 #undef CHECK_OK |
1294 | 1290 |
1295 | 1291 |
1296 } // namespace internal | 1292 } // namespace internal |
1297 } // namespace v8 | 1293 } // namespace v8 |
OLD | NEW |