| 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/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
| (...skipping 3679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3690 } | 3690 } |
| 3691 | 3691 |
| 3692 // FormalParameterList :: | 3692 // FormalParameterList :: |
| 3693 // '(' (Identifier)*[','] ')' | 3693 // '(' (Identifier)*[','] ')' |
| 3694 Expect(Token::LPAREN, CHECK_OK); | 3694 Expect(Token::LPAREN, CHECK_OK); |
| 3695 scope->set_start_position(scanner()->location().beg_pos); | 3695 scope->set_start_position(scanner()->location().beg_pos); |
| 3696 | 3696 |
| 3697 // We don't yet know if the function will be strict, so we cannot yet | 3697 // We don't yet know if the function will be strict, so we cannot yet |
| 3698 // produce errors for parameter names or duplicates. However, we remember | 3698 // produce errors for parameter names or duplicates. However, we remember |
| 3699 // the locations of these errors if they occur and produce the errors later. | 3699 // the locations of these errors if they occur and produce the errors later. |
| 3700 Scanner::Location eval_args_error_log = Scanner::Location::invalid(); | 3700 Scanner::Location eval_args_error_loc = Scanner::Location::invalid(); |
| 3701 Scanner::Location dupe_error_loc = Scanner::Location::invalid(); | 3701 Scanner::Location dupe_error_loc = Scanner::Location::invalid(); |
| 3702 Scanner::Location reserved_loc = Scanner::Location::invalid(); | 3702 Scanner::Location reserved_error_loc = Scanner::Location::invalid(); |
| 3703 | 3703 |
| 3704 bool is_rest = false; | 3704 bool is_rest = false; |
| 3705 bool done = arity_restriction == FunctionLiteral::GETTER_ARITY || | 3705 bool done = arity_restriction == FunctionLiteral::GETTER_ARITY || |
| 3706 (peek() == Token::RPAREN && | 3706 (peek() == Token::RPAREN && |
| 3707 arity_restriction != FunctionLiteral::SETTER_ARITY); | 3707 arity_restriction != FunctionLiteral::SETTER_ARITY); |
| 3708 while (!done) { | 3708 while (!done) { |
| 3709 bool is_strict_reserved = false; | 3709 bool is_strict_reserved = false; |
| 3710 is_rest = peek() == Token::ELLIPSIS && allow_harmony_rest_params(); | 3710 is_rest = peek() == Token::ELLIPSIS && allow_harmony_rest_params(); |
| 3711 if (is_rest) { | 3711 if (is_rest) { |
| 3712 Consume(Token::ELLIPSIS); | 3712 Consume(Token::ELLIPSIS); |
| 3713 } | 3713 } |
| 3714 | 3714 |
| 3715 const AstRawString* param_name = | 3715 const AstRawString* param_name = |
| 3716 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 3716 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 3717 | 3717 |
| 3718 // Store locations for possible future error reports. | 3718 // Store locations for possible future error reports. |
| 3719 if (!eval_args_error_log.IsValid() && IsEvalOrArguments(param_name)) { | 3719 if (!eval_args_error_loc.IsValid() && IsEvalOrArguments(param_name)) { |
| 3720 eval_args_error_log = scanner()->location(); | 3720 eval_args_error_loc = scanner()->location(); |
| 3721 } | 3721 } |
| 3722 if (!reserved_loc.IsValid() && is_strict_reserved) { | 3722 if (!reserved_error_loc.IsValid() && is_strict_reserved) { |
| 3723 reserved_loc = scanner()->location(); | 3723 reserved_error_loc = scanner()->location(); |
| 3724 } | 3724 } |
| 3725 if (!dupe_error_loc.IsValid() && scope_->IsDeclared(param_name)) { | 3725 if (!dupe_error_loc.IsValid() && scope_->IsDeclared(param_name)) { |
| 3726 duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; | 3726 duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; |
| 3727 dupe_error_loc = scanner()->location(); | 3727 dupe_error_loc = scanner()->location(); |
| 3728 } | 3728 } |
| 3729 | 3729 |
| 3730 Variable* var = scope_->DeclareParameter(param_name, VAR, is_rest); | 3730 Variable* var = scope_->DeclareParameter(param_name, VAR, is_rest); |
| 3731 if (is_sloppy(scope->language_mode())) { | 3731 if (is_sloppy(scope->language_mode())) { |
| 3732 // TODO(sigurds) Mark every parameter as maybe assigned. This is a | 3732 // TODO(sigurds) Mark every parameter as maybe assigned. This is a |
| 3733 // conservative approximation necessary to account for parameters | 3733 // conservative approximation necessary to account for parameters |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3824 SkipLazyFunctionBody(function_name, &materialized_literal_count, | 3824 SkipLazyFunctionBody(function_name, &materialized_literal_count, |
| 3825 &expected_property_count, CHECK_OK); | 3825 &expected_property_count, CHECK_OK); |
| 3826 } else { | 3826 } else { |
| 3827 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, | 3827 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, |
| 3828 is_generator, CHECK_OK); | 3828 is_generator, CHECK_OK); |
| 3829 materialized_literal_count = function_state.materialized_literal_count(); | 3829 materialized_literal_count = function_state.materialized_literal_count(); |
| 3830 expected_property_count = function_state.expected_property_count(); | 3830 expected_property_count = function_state.expected_property_count(); |
| 3831 handler_count = function_state.handler_count(); | 3831 handler_count = function_state.handler_count(); |
| 3832 } | 3832 } |
| 3833 | 3833 |
| 3834 // Validate strict mode. | 3834 // Validate name and parameter names. We can do this only after parsing the |
| 3835 // Concise methods use StrictFormalParameters. | 3835 // function, since the function can declare itself strict. |
| 3836 // Functions for which IsSimpleParameterList() returns false use | 3836 CheckFunctionName(language_mode(), kind, function_name, |
| 3837 // StrictFormalParameters. | 3837 name_is_strict_reserved, function_name_location, |
| 3838 if (is_strict(language_mode()) || IsConciseMethod(kind) || is_rest) { | 3838 CHECK_OK); |
| 3839 CheckStrictFunctionNameAndParameters(function_name, | 3839 const bool use_strict_params = is_rest || IsConciseMethod(kind); |
| 3840 name_is_strict_reserved, | 3840 CheckFunctionParameterNames(language_mode(), use_strict_params, |
| 3841 function_name_location, | 3841 eval_args_error_loc, dupe_error_loc, |
| 3842 eval_args_error_log, | 3842 reserved_error_loc, CHECK_OK); |
| 3843 dupe_error_loc, | 3843 |
| 3844 reserved_loc, | |
| 3845 CHECK_OK); | |
| 3846 } | |
| 3847 if (is_strict(language_mode())) { | 3844 if (is_strict(language_mode())) { |
| 3848 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), | 3845 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), |
| 3849 CHECK_OK); | 3846 CHECK_OK); |
| 3850 } | 3847 } |
| 3851 if (allow_harmony_scoping() && is_strict(language_mode())) { | 3848 if (allow_harmony_scoping() && is_strict(language_mode())) { |
| 3852 CheckConflictingVarDeclarations(scope, CHECK_OK); | 3849 CheckConflictingVarDeclarations(scope, CHECK_OK); |
| 3853 } | 3850 } |
| 3854 } | 3851 } |
| 3855 | 3852 |
| 3856 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | 3853 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
| (...skipping 1572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5429 } else { | 5426 } else { |
| 5430 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5427 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
| 5431 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5428 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
| 5432 raw_string->length()); | 5429 raw_string->length()); |
| 5433 } | 5430 } |
| 5434 } | 5431 } |
| 5435 | 5432 |
| 5436 return running_hash; | 5433 return running_hash; |
| 5437 } | 5434 } |
| 5438 } } // namespace v8::internal | 5435 } } // namespace v8::internal |
| OLD | NEW |