OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/ast-literal-reindexer.h" | 9 #include "src/ast-literal-reindexer.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 } | 864 } |
865 | 865 |
866 | 866 |
867 Expression* ParserTraits::ParseV8Intrinsic(bool* ok) { | 867 Expression* ParserTraits::ParseV8Intrinsic(bool* ok) { |
868 return parser_->ParseV8Intrinsic(ok); | 868 return parser_->ParseV8Intrinsic(ok); |
869 } | 869 } |
870 | 870 |
871 | 871 |
872 FunctionLiteral* ParserTraits::ParseFunctionLiteral( | 872 FunctionLiteral* ParserTraits::ParseFunctionLiteral( |
873 const AstRawString* name, Scanner::Location function_name_location, | 873 const AstRawString* name, Scanner::Location function_name_location, |
874 bool name_is_strict_reserved, FunctionKind kind, | 874 FunctionNameValidity function_name_validity, FunctionKind kind, |
875 int function_token_position, FunctionLiteral::FunctionType type, | 875 int function_token_position, FunctionLiteral::FunctionType type, |
876 FunctionLiteral::ArityRestriction arity_restriction, bool* ok) { | 876 FunctionLiteral::ArityRestriction arity_restriction, bool* ok) { |
877 return parser_->ParseFunctionLiteral( | 877 return parser_->ParseFunctionLiteral( |
878 name, function_name_location, name_is_strict_reserved, kind, | 878 name, function_name_location, function_name_validity, kind, |
879 function_token_position, type, arity_restriction, ok); | 879 function_token_position, type, arity_restriction, ok); |
880 } | 880 } |
881 | 881 |
882 | 882 |
883 ClassLiteral* ParserTraits::ParseClassLiteral( | 883 ClassLiteral* ParserTraits::ParseClassLiteral( |
884 const AstRawString* name, Scanner::Location class_name_location, | 884 const AstRawString* name, Scanner::Location class_name_location, |
885 bool name_is_strict_reserved, int pos, bool* ok) { | 885 bool name_is_strict_reserved, int pos, bool* ok) { |
886 return parser_->ParseClassLiteral(name, class_name_location, | 886 return parser_->ParseClassLiteral(name, class_name_location, |
887 name_is_strict_reserved, pos, ok); | 887 name_is_strict_reserved, pos, ok); |
888 } | 888 } |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 ok = false; | 1220 ok = false; |
1221 } | 1221 } |
1222 } | 1222 } |
1223 } | 1223 } |
1224 } else if (shared_info->is_default_constructor()) { | 1224 } else if (shared_info->is_default_constructor()) { |
1225 result = DefaultConstructor(IsSubclassConstructor(shared_info->kind()), | 1225 result = DefaultConstructor(IsSubclassConstructor(shared_info->kind()), |
1226 scope, shared_info->start_position(), | 1226 scope, shared_info->start_position(), |
1227 shared_info->end_position()); | 1227 shared_info->end_position()); |
1228 } else { | 1228 } else { |
1229 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), | 1229 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), |
1230 false, // Strict mode name already checked. | 1230 kSkipFunctionNameCheck, shared_info->kind(), |
1231 shared_info->kind(), RelocInfo::kNoPosition, | 1231 RelocInfo::kNoPosition, function_type, |
1232 function_type, | |
1233 FunctionLiteral::NORMAL_ARITY, &ok); | 1232 FunctionLiteral::NORMAL_ARITY, &ok); |
1234 } | 1233 } |
1235 // Make sure the results agree. | 1234 // Make sure the results agree. |
1236 DCHECK(ok == (result != NULL)); | 1235 DCHECK(ok == (result != NULL)); |
1237 } | 1236 } |
1238 | 1237 |
1239 // Make sure the target stack is empty. | 1238 // Make sure the target stack is empty. |
1240 DCHECK(target_stack_ == NULL); | 1239 DCHECK(target_stack_ == NULL); |
1241 | 1240 |
1242 if (result != NULL) { | 1241 if (result != NULL) { |
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2187 // GeneratorDeclaration :: | 2186 // GeneratorDeclaration :: |
2188 // 'function' '*' Identifier '(' FormalParameterListopt ')' | 2187 // 'function' '*' Identifier '(' FormalParameterListopt ')' |
2189 // '{' FunctionBody '}' | 2188 // '{' FunctionBody '}' |
2190 Expect(Token::FUNCTION, CHECK_OK); | 2189 Expect(Token::FUNCTION, CHECK_OK); |
2191 int pos = position(); | 2190 int pos = position(); |
2192 bool is_generator = Check(Token::MUL); | 2191 bool is_generator = Check(Token::MUL); |
2193 bool is_strict_reserved = false; | 2192 bool is_strict_reserved = false; |
2194 const AstRawString* name = ParseIdentifierOrStrictReservedWord( | 2193 const AstRawString* name = ParseIdentifierOrStrictReservedWord( |
2195 &is_strict_reserved, CHECK_OK); | 2194 &is_strict_reserved, CHECK_OK); |
2196 FunctionLiteral* fun = | 2195 FunctionLiteral* fun = |
2197 ParseFunctionLiteral(name, scanner()->location(), is_strict_reserved, | 2196 ParseFunctionLiteral(name, scanner()->location(), |
| 2197 is_strict_reserved ? kFunctionNameIsStrictReserved |
| 2198 : kFunctionNameValidityUnknown, |
2198 is_generator ? FunctionKind::kGeneratorFunction | 2199 is_generator ? FunctionKind::kGeneratorFunction |
2199 : FunctionKind::kNormalFunction, | 2200 : FunctionKind::kNormalFunction, |
2200 pos, FunctionLiteral::DECLARATION, | 2201 pos, FunctionLiteral::DECLARATION, |
2201 FunctionLiteral::NORMAL_ARITY, CHECK_OK); | 2202 FunctionLiteral::NORMAL_ARITY, CHECK_OK); |
2202 // Even if we're not at the top-level of the global or a function | 2203 // Even if we're not at the top-level of the global or a function |
2203 // scope, we treat it as such and introduce the function with its | 2204 // scope, we treat it as such and introduce the function with its |
2204 // initial value upon entering the corresponding scope. | 2205 // initial value upon entering the corresponding scope. |
2205 // In ES6, a function behaves as a lexical binding, except in | 2206 // In ES6, a function behaves as a lexical binding, except in |
2206 // a script scope, or the initial scope of eval or another function. | 2207 // a script scope, or the initial scope of eval or another function. |
2207 VariableMode mode = | 2208 VariableMode mode = |
(...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3907 if (p.pattern != nullptr) reindexer.Reindex(p.pattern); | 3908 if (p.pattern != nullptr) reindexer.Reindex(p.pattern); |
3908 } | 3909 } |
3909 DCHECK(reindexer.count() <= | 3910 DCHECK(reindexer.count() <= |
3910 parser_->function_state_->materialized_literal_count()); | 3911 parser_->function_state_->materialized_literal_count()); |
3911 } | 3912 } |
3912 } | 3913 } |
3913 | 3914 |
3914 | 3915 |
3915 FunctionLiteral* Parser::ParseFunctionLiteral( | 3916 FunctionLiteral* Parser::ParseFunctionLiteral( |
3916 const AstRawString* function_name, Scanner::Location function_name_location, | 3917 const AstRawString* function_name, Scanner::Location function_name_location, |
3917 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, | 3918 FunctionNameValidity function_name_validity, FunctionKind kind, |
3918 FunctionLiteral::FunctionType function_type, | 3919 int function_token_pos, FunctionLiteral::FunctionType function_type, |
3919 FunctionLiteral::ArityRestriction arity_restriction, bool* ok) { | 3920 FunctionLiteral::ArityRestriction arity_restriction, bool* ok) { |
3920 // Function :: | 3921 // Function :: |
3921 // '(' FormalParameterList? ')' '{' FunctionBody '}' | 3922 // '(' FormalParameterList? ')' '{' FunctionBody '}' |
3922 // | 3923 // |
3923 // Getter :: | 3924 // Getter :: |
3924 // '(' ')' '{' FunctionBody '}' | 3925 // '(' ')' '{' FunctionBody '}' |
3925 // | 3926 // |
3926 // Setter :: | 3927 // Setter :: |
3927 // '(' PropertySetParameterList ')' '{' FunctionBody '}' | 3928 // '(' PropertySetParameterList ')' '{' FunctionBody '}' |
3928 | 3929 |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4121 MessageTemplate::kStrongSuperCallMissing, | 4122 MessageTemplate::kStrongSuperCallMissing, |
4122 kReferenceError); | 4123 kReferenceError); |
4123 *ok = false; | 4124 *ok = false; |
4124 return nullptr; | 4125 return nullptr; |
4125 } | 4126 } |
4126 } | 4127 } |
4127 } | 4128 } |
4128 | 4129 |
4129 // Validate name and parameter names. We can do this only after parsing the | 4130 // Validate name and parameter names. We can do this only after parsing the |
4130 // function, since the function can declare itself strict. | 4131 // function, since the function can declare itself strict. |
4131 CheckFunctionName(language_mode(), kind, function_name, | 4132 CheckFunctionName(language_mode(), function_name, function_name_validity, |
4132 name_is_strict_reserved, function_name_location, | 4133 function_name_location, CHECK_OK); |
4133 CHECK_OK); | |
4134 const bool use_strict_params = | 4134 const bool use_strict_params = |
4135 !parsing_state.is_simple_parameter_list || IsConciseMethod(kind); | 4135 !parsing_state.is_simple_parameter_list || IsConciseMethod(kind); |
4136 const bool allow_duplicate_parameters = | 4136 const bool allow_duplicate_parameters = |
4137 is_sloppy(language_mode()) && !use_strict_params; | 4137 is_sloppy(language_mode()) && !use_strict_params; |
4138 ValidateFormalParameters(&formals_classifier, language_mode(), | 4138 ValidateFormalParameters(&formals_classifier, language_mode(), |
4139 allow_duplicate_parameters, CHECK_OK); | 4139 allow_duplicate_parameters, CHECK_OK); |
4140 | 4140 |
4141 if (is_strict(language_mode())) { | 4141 if (is_strict(language_mode())) { |
4142 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), | 4142 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), |
4143 CHECK_OK); | 4143 CHECK_OK); |
(...skipping 1800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5944 Expression* Parser::SpreadCallNew(Expression* function, | 5944 Expression* Parser::SpreadCallNew(Expression* function, |
5945 ZoneList<v8::internal::Expression*>* args, | 5945 ZoneList<v8::internal::Expression*>* args, |
5946 int pos) { | 5946 int pos) { |
5947 args->InsertAt(0, function, zone()); | 5947 args->InsertAt(0, function, zone()); |
5948 | 5948 |
5949 return factory()->NewCallRuntime( | 5949 return factory()->NewCallRuntime( |
5950 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5950 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
5951 } | 5951 } |
5952 } // namespace internal | 5952 } // namespace internal |
5953 } // namespace v8 | 5953 } // namespace v8 |
OLD | NEW |