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 #ifndef V8_PARSING_PREPARSER_H | 5 #ifndef V8_PARSING_PREPARSER_H |
6 #define V8_PARSING_PREPARSER_H | 6 #define V8_PARSING_PREPARSER_H |
7 | 7 |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/parsing/parser-base.h" | 10 #include "src/parsing/parser-base.h" |
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 PreParserStatement NewReturnStatement(PreParserExpression expression, | 669 PreParserStatement NewReturnStatement(PreParserExpression expression, |
670 int pos) { | 670 int pos) { |
671 return PreParserStatement::Jump(); | 671 return PreParserStatement::Jump(); |
672 } | 672 } |
673 PreParserStatement NewAsyncReturnStatement(PreParserExpression expression, | 673 PreParserStatement NewAsyncReturnStatement(PreParserExpression expression, |
674 int pos) { | 674 int pos) { |
675 return PreParserStatement::Jump(); | 675 return PreParserStatement::Jump(); |
676 } | 676 } |
677 PreParserExpression NewFunctionLiteral( | 677 PreParserExpression NewFunctionLiteral( |
678 PreParserIdentifier name, Scope* scope, PreParserStatementList body, | 678 PreParserIdentifier name, Scope* scope, PreParserStatementList body, |
679 int materialized_literal_count, int expected_property_count, | 679 int expected_property_count, int parameter_count, int function_length, |
680 int parameter_count, int function_length, | |
681 FunctionLiteral::ParameterFlag has_duplicate_parameters, | 680 FunctionLiteral::ParameterFlag has_duplicate_parameters, |
682 FunctionLiteral::FunctionType function_type, | 681 FunctionLiteral::FunctionType function_type, |
683 FunctionLiteral::EagerCompileHint eager_compile_hint, int position, | 682 FunctionLiteral::EagerCompileHint eager_compile_hint, int position, |
684 bool has_braces, int function_literal_id) { | 683 bool has_braces, int function_literal_id) { |
685 return PreParserExpression::Default(); | 684 return PreParserExpression::Default(); |
686 } | 685 } |
687 | 686 |
688 PreParserExpression NewSpread(PreParserExpression expression, int pos, | 687 PreParserExpression NewSpread(PreParserExpression expression, int pos, |
689 int expr_pos) { | 688 int expr_pos) { |
690 return PreParserExpression::Spread(expression); | 689 return PreParserExpression::Spread(expression); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 pending_error_handler_(pending_error_handler) {} | 886 pending_error_handler_(pending_error_handler) {} |
888 | 887 |
889 static bool const IsPreParser() { return true; } | 888 static bool const IsPreParser() { return true; } |
890 | 889 |
891 PreParserLogger* logger() { return &log_; } | 890 PreParserLogger* logger() { return &log_; } |
892 | 891 |
893 // Pre-parse the program from the character stream; returns true on | 892 // Pre-parse the program from the character stream; returns true on |
894 // success (even if parsing failed, the pre-parse data successfully | 893 // success (even if parsing failed, the pre-parse data successfully |
895 // captured the syntax error), and false if a stack-overflow happened | 894 // captured the syntax error), and false if a stack-overflow happened |
896 // during parsing. | 895 // during parsing. |
897 PreParseResult PreParseProgram(int* materialized_literals = 0, | 896 PreParseResult PreParseProgram(bool is_module = false) { |
898 bool is_module = false) { | |
899 DCHECK_NULL(scope_state_); | 897 DCHECK_NULL(scope_state_); |
900 DeclarationScope* scope = NewScriptScope(); | 898 DeclarationScope* scope = NewScriptScope(); |
901 #ifdef DEBUG | 899 #ifdef DEBUG |
902 scope->set_is_being_lazily_parsed(true); | 900 scope->set_is_being_lazily_parsed(true); |
903 #endif | 901 #endif |
904 | 902 |
905 // ModuleDeclarationInstantiation for Source Text Module Records creates a | 903 // ModuleDeclarationInstantiation for Source Text Module Records creates a |
906 // new Module Environment Record whose outer lexical environment record is | 904 // new Module Environment Record whose outer lexical environment record is |
907 // the global scope. | 905 // the global scope. |
908 if (is_module) scope = NewModuleScope(scope); | 906 if (is_module) scope = NewModuleScope(scope); |
909 | 907 |
910 FunctionState top_scope(&function_state_, &scope_state_, scope); | 908 FunctionState top_scope(&function_state_, &scope_state_, scope); |
911 bool ok = true; | 909 bool ok = true; |
912 int start_position = scanner()->peek_location().beg_pos; | 910 int start_position = scanner()->peek_location().beg_pos; |
913 parsing_module_ = is_module; | 911 parsing_module_ = is_module; |
914 PreParserStatementList body; | 912 PreParserStatementList body; |
915 ParseStatementList(body, Token::EOS, &ok); | 913 ParseStatementList(body, Token::EOS, &ok); |
916 if (stack_overflow()) return kPreParseStackOverflow; | 914 if (stack_overflow()) return kPreParseStackOverflow; |
917 if (!ok) { | 915 if (!ok) { |
918 ReportUnexpectedToken(scanner()->current_token()); | 916 ReportUnexpectedToken(scanner()->current_token()); |
919 } else if (is_strict(this->scope()->language_mode())) { | 917 } else if (is_strict(this->scope()->language_mode())) { |
920 CheckStrictOctalLiteral(start_position, scanner()->location().end_pos, | 918 CheckStrictOctalLiteral(start_position, scanner()->location().end_pos, |
921 &ok); | 919 &ok); |
922 } | 920 } |
923 if (materialized_literals) { | |
924 *materialized_literals = function_state_->materialized_literal_count(); | |
925 } | |
926 return kPreParseSuccess; | 921 return kPreParseSuccess; |
927 } | 922 } |
928 | 923 |
929 // Parses a single function literal, from the opening parentheses before | 924 // Parses a single function literal, from the opening parentheses before |
930 // parameters to the closing brace after the body. | 925 // parameters to the closing brace after the body. |
931 // Returns a FunctionEntry describing the body of the function in enough | 926 // Returns a FunctionEntry describing the body of the function in enough |
932 // detail that it can be lazily compiled. | 927 // detail that it can be lazily compiled. |
933 // The scanner is expected to have matched the "function" or "function*" | 928 // The scanner is expected to have matched the "function" or "function*" |
934 // keyword and parameters, and have consumed the initial '{'. | 929 // keyword and parameters, and have consumed the initial '{'. |
935 // At return, unless an error occurred, the scanner is positioned before the | 930 // At return, unless an error occurred, the scanner is positioned before the |
(...skipping 13 matching lines...) Expand all Loading... |
949 // All ParseXXX functions take as the last argument an *ok parameter | 944 // All ParseXXX functions take as the last argument an *ok parameter |
950 // which is set to false if parsing failed; it is unchanged otherwise. | 945 // which is set to false if parsing failed; it is unchanged otherwise. |
951 // By making the 'exception handling' explicit, we are forced to check | 946 // By making the 'exception handling' explicit, we are forced to check |
952 // for failure at the call sites. | 947 // for failure at the call sites. |
953 | 948 |
954 // Indicates that we won't switch from the preparser to the preparser; we'll | 949 // Indicates that we won't switch from the preparser to the preparser; we'll |
955 // just stay where we are. | 950 // just stay where we are. |
956 bool AllowsLazyParsingWithoutUnresolvedVariables() const { return false; } | 951 bool AllowsLazyParsingWithoutUnresolvedVariables() const { return false; } |
957 bool parse_lazily() const { return false; } | 952 bool parse_lazily() const { return false; } |
958 | 953 |
959 V8_INLINE LazyParsingResult SkipFunction( | 954 V8_INLINE LazyParsingResult |
960 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters, | 955 SkipFunction(FunctionKind kind, DeclarationScope* function_scope, |
961 int* function_length, bool* has_duplicate_parameters, | 956 int* num_parameters, int* function_length, |
962 int* materialized_literal_count, int* expected_property_count, | 957 bool* has_duplicate_parameters, int* expected_property_count, |
963 bool is_inner_function, bool may_abort, bool* ok) { | 958 bool is_inner_function, bool may_abort, bool* ok) { |
964 UNREACHABLE(); | 959 UNREACHABLE(); |
965 return kLazyParsingComplete; | 960 return kLazyParsingComplete; |
966 } | 961 } |
967 Expression ParseFunctionLiteral( | 962 Expression ParseFunctionLiteral( |
968 Identifier name, Scanner::Location function_name_location, | 963 Identifier name, Scanner::Location function_name_location, |
969 FunctionNameValidity function_name_validity, FunctionKind kind, | 964 FunctionNameValidity function_name_validity, FunctionKind kind, |
970 int function_token_pos, FunctionLiteral::FunctionType function_type, | 965 int function_token_pos, FunctionLiteral::FunctionType function_type, |
971 LanguageMode language_mode, bool* ok); | 966 LanguageMode language_mode, bool* ok); |
972 LazyParsingResult ParseStatementListAndLogFunction( | 967 LazyParsingResult ParseStatementListAndLogFunction( |
973 PreParserFormalParameters* formals, bool has_duplicate_parameters, | 968 PreParserFormalParameters* formals, bool has_duplicate_parameters, |
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 } | 1627 } |
1633 | 1628 |
1634 V8_INLINE PreParserExpression NoTemplateTag() { | 1629 V8_INLINE PreParserExpression NoTemplateTag() { |
1635 return PreParserExpression::NoTemplateTag(); | 1630 return PreParserExpression::NoTemplateTag(); |
1636 } | 1631 } |
1637 | 1632 |
1638 V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) { | 1633 V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) { |
1639 return !tag.IsNoTemplateTag(); | 1634 return !tag.IsNoTemplateTag(); |
1640 } | 1635 } |
1641 | 1636 |
1642 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) { | |
1643 for (int i = 0; i < count; ++i) { | |
1644 function_state_->NextMaterializedLiteralIndex(); | |
1645 } | |
1646 } | |
1647 | |
1648 V8_INLINE PreParserExpression | 1637 V8_INLINE PreParserExpression |
1649 ExpressionListToExpression(PreParserExpressionList args) { | 1638 ExpressionListToExpression(PreParserExpressionList args) { |
1650 return PreParserExpression::Default(args.variables_); | 1639 return PreParserExpression::Default(args.variables_); |
1651 } | 1640 } |
1652 | 1641 |
1653 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, | 1642 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, |
1654 PreParserExpression function, | 1643 PreParserExpression function, |
1655 PreParserIdentifier name) {} | 1644 PreParserIdentifier name) {} |
1656 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, | 1645 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, |
1657 PreParserIdentifier name) {} | 1646 PreParserIdentifier name) {} |
(...skipping 29 matching lines...) Expand all Loading... |
1687 | 1676 |
1688 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function, | 1677 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function, |
1689 PreParserExpressionList args, | 1678 PreParserExpressionList args, |
1690 int pos) { | 1679 int pos) { |
1691 return factory()->NewCallNew(function, args, pos); | 1680 return factory()->NewCallNew(function, args, pos); |
1692 } | 1681 } |
1693 | 1682 |
1694 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state, | 1683 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state, |
1695 int start, | 1684 int start, |
1696 PreParserExpression tag) { | 1685 PreParserExpression tag) { |
1697 if (IsTaggedTemplate(tag)) { | |
1698 // Emulate generation of array literals for tag callsite | |
1699 // 1st is array of cooked strings, second is array of raw strings | |
1700 function_state_->NextMaterializedLiteralIndex(); | |
1701 function_state_->NextMaterializedLiteralIndex(); | |
1702 } | |
1703 return EmptyExpression(); | 1686 return EmptyExpression(); |
1704 } | 1687 } |
1705 | 1688 |
1706 } // namespace internal | 1689 } // namespace internal |
1707 } // namespace v8 | 1690 } // namespace v8 |
1708 | 1691 |
1709 #endif // V8_PARSING_PREPARSER_H | 1692 #endif // V8_PARSING_PREPARSER_H |
OLD | NEW |