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 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
716 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, | 716 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, |
717 int pos, Scope* scope, | 717 int pos, Scope* scope, |
718 AstNodeFactory* factory) { | 718 AstNodeFactory* factory) { |
719 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); | 719 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); |
720 // The name may refer to a module instance object, so its type is unknown. | 720 // The name may refer to a module instance object, so its type is unknown. |
721 #ifdef DEBUG | 721 #ifdef DEBUG |
722 if (FLAG_print_interface_details) | 722 if (FLAG_print_interface_details) |
723 PrintF("# Variable %.*s ", name->length(), name->raw_data()); | 723 PrintF("# Variable %.*s ", name->length(), name->raw_data()); |
724 #endif | 724 #endif |
725 Interface* interface = Interface::NewUnknown(parser_->zone()); | 725 Interface* interface = Interface::NewUnknown(parser_->zone()); |
726 return scope->NewUnresolved(factory, name, interface, pos); | 726 |
727 // Arrow function parameters are parsed as an expression. When | |
728 // parsing lazily, it is enough to create a VariableProxy in order | |
729 // for Traits::DeclareArrowParametersFromExpression() to be able to | |
730 // pick the names of the parameters. | |
731 return parser_->parsing_lazy_arrow_parameters_ | |
732 ? factory->NewVariableProxy(name, false, interface, pos) | |
733 : scope->NewUnresolved(factory, name, interface, pos); | |
727 } | 734 } |
728 | 735 |
729 | 736 |
730 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, | 737 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, |
731 AstNodeFactory* factory) { | 738 AstNodeFactory* factory) { |
732 const AstRawString* symbol = GetSymbol(scanner); | 739 const AstRawString* symbol = GetSymbol(scanner); |
733 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); | 740 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); |
734 return factory->NewStringLiteral(symbol, pos); | 741 return factory->NewStringLiteral(symbol, pos); |
735 } | 742 } |
736 | 743 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
781 Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) | 788 Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) |
782 : ParserBase<ParserTraits>(info->isolate(), info->zone(), &scanner_, | 789 : ParserBase<ParserTraits>(info->isolate(), info->zone(), &scanner_, |
783 parse_info->stack_limit, info->extension(), NULL, | 790 parse_info->stack_limit, info->extension(), NULL, |
784 this), | 791 this), |
785 scanner_(parse_info->unicode_cache), | 792 scanner_(parse_info->unicode_cache), |
786 reusable_preparser_(NULL), | 793 reusable_preparser_(NULL), |
787 original_scope_(NULL), | 794 original_scope_(NULL), |
788 target_stack_(NULL), | 795 target_stack_(NULL), |
789 cached_parse_data_(NULL), | 796 cached_parse_data_(NULL), |
790 info_(info), | 797 info_(info), |
798 parsing_lazy_arrow_parameters_(false), | |
791 has_pending_error_(false), | 799 has_pending_error_(false), |
792 pending_error_message_(NULL), | 800 pending_error_message_(NULL), |
793 pending_error_arg_(NULL), | 801 pending_error_arg_(NULL), |
794 pending_error_char_arg_(NULL), | 802 pending_error_char_arg_(NULL), |
795 total_preparse_skipped_(0), | 803 total_preparse_skipped_(0), |
796 pre_parse_timer_(NULL) { | 804 pre_parse_timer_(NULL) { |
797 DCHECK(!script().is_null() || info->source_stream() != NULL); | 805 DCHECK(!script().is_null() || info->source_stream() != NULL); |
798 set_allow_lazy(false); // Must be explicitly enabled. | 806 set_allow_lazy(false); // Must be explicitly enabled. |
799 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); | 807 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); |
800 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); | 808 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1054 DCHECK(info()->strict_mode() == shared_info->strict_mode()); | 1062 DCHECK(info()->strict_mode() == shared_info->strict_mode()); |
1055 scope->SetStrictMode(shared_info->strict_mode()); | 1063 scope->SetStrictMode(shared_info->strict_mode()); |
1056 FunctionLiteral::FunctionType function_type = shared_info->is_expression() | 1064 FunctionLiteral::FunctionType function_type = shared_info->is_expression() |
1057 ? (shared_info->is_anonymous() | 1065 ? (shared_info->is_anonymous() |
1058 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 1066 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
1059 : FunctionLiteral::NAMED_EXPRESSION) | 1067 : FunctionLiteral::NAMED_EXPRESSION) |
1060 : FunctionLiteral::DECLARATION; | 1068 : FunctionLiteral::DECLARATION; |
1061 bool ok = true; | 1069 bool ok = true; |
1062 | 1070 |
1063 if (shared_info->is_arrow()) { | 1071 if (shared_info->is_arrow()) { |
1072 // The first expression being parsed is the parameter list of the arrow | |
1073 // function. Setting this avoids prevents ExpressionFromIdentifier() | |
1074 // from creating unresolved variables in already-resolved scopes. | |
1075 parsing_lazy_arrow_parameters_ = true; | |
1064 Expression* expression = ParseExpression(false, &ok); | 1076 Expression* expression = ParseExpression(false, &ok); |
1065 DCHECK(expression->IsFunctionLiteral()); | 1077 DCHECK(expression->IsFunctionLiteral()); |
1066 result = expression->AsFunctionLiteral(); | 1078 result = expression->AsFunctionLiteral(); |
marja
2015/01/29 09:53:01
Why are setting parsing_lazy_arrow_parameters_ to
aperez
2015/01/29 14:38:03
That does not work.
ParseExpression() here parses
| |
1067 } else if (shared_info->is_default_constructor()) { | 1079 } else if (shared_info->is_default_constructor()) { |
1068 result = DefaultConstructor(shared_info->uses_super_constructor_call(), | 1080 result = DefaultConstructor(shared_info->uses_super_constructor_call(), |
1069 scope, shared_info->start_position(), | 1081 scope, shared_info->start_position(), |
1070 shared_info->end_position()); | 1082 shared_info->end_position()); |
1071 } else { | 1083 } else { |
1072 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), | 1084 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), |
1073 false, // Strict mode name already checked. | 1085 false, // Strict mode name already checked. |
1074 shared_info->kind(), RelocInfo::kNoPosition, | 1086 shared_info->kind(), RelocInfo::kNoPosition, |
1075 function_type, | 1087 function_type, |
1076 FunctionLiteral::NORMAL_ARITY, &ok); | 1088 FunctionLiteral::NORMAL_ARITY, &ok); |
(...skipping 2257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3334 | 3346 |
3335 // Any other kind of expression is not a valid parameter list. | 3347 // Any other kind of expression is not a valid parameter list. |
3336 return false; | 3348 return false; |
3337 } | 3349 } |
3338 | 3350 |
3339 | 3351 |
3340 int ParserTraits::DeclareArrowParametersFromExpression( | 3352 int ParserTraits::DeclareArrowParametersFromExpression( |
3341 Expression* expression, Scope* scope, Scanner::Location* dupe_loc, | 3353 Expression* expression, Scope* scope, Scanner::Location* dupe_loc, |
3342 bool* ok) { | 3354 bool* ok) { |
3343 int num_params = 0; | 3355 int num_params = 0; |
3356 // Always reset the flag: It only needs to be set for the first expression | |
3357 // parsed as arrow function parameter list, becauseonly top-level functions | |
3358 // are parsed lazily. | |
3359 parser_->parsing_lazy_arrow_parameters_ = false; | |
3344 *ok = CheckAndDeclareArrowParameter(this, expression, scope, &num_params, | 3360 *ok = CheckAndDeclareArrowParameter(this, expression, scope, &num_params, |
3345 dupe_loc); | 3361 dupe_loc); |
3346 return num_params; | 3362 return num_params; |
3347 } | 3363 } |
3348 | 3364 |
3349 | 3365 |
3350 FunctionLiteral* Parser::ParseFunctionLiteral( | 3366 FunctionLiteral* Parser::ParseFunctionLiteral( |
3351 const AstRawString* function_name, Scanner::Location function_name_location, | 3367 const AstRawString* function_name, Scanner::Location function_name_location, |
3352 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, | 3368 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, |
3353 FunctionLiteral::FunctionType function_type, | 3369 FunctionLiteral::FunctionType function_type, |
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5143 } else { | 5159 } else { |
5144 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5160 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
5145 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5161 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
5146 raw_string->length()); | 5162 raw_string->length()); |
5147 } | 5163 } |
5148 } | 5164 } |
5149 | 5165 |
5150 return running_hash; | 5166 return running_hash; |
5151 } | 5167 } |
5152 } } // namespace v8::internal | 5168 } } // namespace v8::internal |
OLD | NEW |