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_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
7 | 7 |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/hashmap.h" | 10 #include "src/base/hashmap.h" |
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
852 | 852 |
853 // Checking the name of a function literal. This has to be done after parsing | 853 // Checking the name of a function literal. This has to be done after parsing |
854 // the function, since the function can declare itself strict. | 854 // the function, since the function can declare itself strict. |
855 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, | 855 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, |
856 FunctionNameValidity function_name_validity, | 856 FunctionNameValidity function_name_validity, |
857 const Scanner::Location& function_name_loc, bool* ok) { | 857 const Scanner::Location& function_name_loc, bool* ok) { |
858 if (function_name_validity == kSkipFunctionNameCheck) return; | 858 if (function_name_validity == kSkipFunctionNameCheck) return; |
859 // The function name needs to be checked in strict mode. | 859 // The function name needs to be checked in strict mode. |
860 if (is_sloppy(language_mode)) return; | 860 if (is_sloppy(language_mode)) return; |
861 | 861 |
862 if (this->IsEvalOrArguments(function_name)) { | 862 if (impl()->IsEvalOrArguments(function_name)) { |
863 Traits::ReportMessageAt(function_name_loc, | 863 Traits::ReportMessageAt(function_name_loc, |
864 MessageTemplate::kStrictEvalArguments); | 864 MessageTemplate::kStrictEvalArguments); |
865 *ok = false; | 865 *ok = false; |
866 return; | 866 return; |
867 } | 867 } |
868 if (function_name_validity == kFunctionNameIsStrictReserved) { | 868 if (function_name_validity == kFunctionNameIsStrictReserved) { |
869 Traits::ReportMessageAt(function_name_loc, | 869 Traits::ReportMessageAt(function_name_loc, |
870 MessageTemplate::kUnexpectedStrictReserved); | 870 MessageTemplate::kUnexpectedStrictReserved); |
871 *ok = false; | 871 *ok = false; |
872 return; | 872 return; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 bool IsValidArrowFormalParametersStart(Token::Value token) { | 998 bool IsValidArrowFormalParametersStart(Token::Value token) { |
999 return is_any_identifier(token) || token == Token::LPAREN; | 999 return is_any_identifier(token) || token == Token::LPAREN; |
1000 } | 1000 } |
1001 | 1001 |
1002 void ValidateArrowFormalParameters(const ExpressionClassifier* classifier, | 1002 void ValidateArrowFormalParameters(const ExpressionClassifier* classifier, |
1003 ExpressionT expr, | 1003 ExpressionT expr, |
1004 bool parenthesized_formals, bool is_async, | 1004 bool parenthesized_formals, bool is_async, |
1005 bool* ok) { | 1005 bool* ok) { |
1006 if (classifier->is_valid_binding_pattern()) { | 1006 if (classifier->is_valid_binding_pattern()) { |
1007 // A simple arrow formal parameter: IDENTIFIER => BODY. | 1007 // A simple arrow formal parameter: IDENTIFIER => BODY. |
1008 if (!this->IsIdentifier(expr)) { | 1008 if (!impl()->IsIdentifier(expr)) { |
1009 Traits::ReportMessageAt(scanner()->location(), | 1009 Traits::ReportMessageAt(scanner()->location(), |
1010 MessageTemplate::kUnexpectedToken, | 1010 MessageTemplate::kUnexpectedToken, |
1011 Token::String(scanner()->current_token())); | 1011 Token::String(scanner()->current_token())); |
1012 *ok = false; | 1012 *ok = false; |
1013 } | 1013 } |
1014 } else if (!classifier->is_valid_arrow_formal_parameters()) { | 1014 } else if (!classifier->is_valid_arrow_formal_parameters()) { |
1015 // If after parsing the expr, we see an error but the expression is | 1015 // If after parsing the expr, we see an error but the expression is |
1016 // neither a valid binding pattern nor a valid parenthesized formal | 1016 // neither a valid binding pattern nor a valid parenthesized formal |
1017 // parameter list, show the "arrow formal parameters" error if the formals | 1017 // parameter list, show the "arrow formal parameters" error if the formals |
1018 // started with a parenthesis, and the binding pattern error otherwise. | 1018 // started with a parenthesis, and the binding pattern error otherwise. |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1177 ExpressionT CheckAndRewriteReferenceExpression( | 1177 ExpressionT CheckAndRewriteReferenceExpression( |
1178 ExpressionT expression, int beg_pos, int end_pos, | 1178 ExpressionT expression, int beg_pos, int end_pos, |
1179 MessageTemplate::Template message, bool* ok); | 1179 MessageTemplate::Template message, bool* ok); |
1180 ExpressionT CheckAndRewriteReferenceExpression( | 1180 ExpressionT CheckAndRewriteReferenceExpression( |
1181 ExpressionT expression, int beg_pos, int end_pos, | 1181 ExpressionT expression, int beg_pos, int end_pos, |
1182 MessageTemplate::Template message, ParseErrorType type, bool* ok); | 1182 MessageTemplate::Template message, ParseErrorType type, bool* ok); |
1183 | 1183 |
1184 bool IsValidReferenceExpression(ExpressionT expression); | 1184 bool IsValidReferenceExpression(ExpressionT expression); |
1185 | 1185 |
1186 bool IsAssignableIdentifier(ExpressionT expression) { | 1186 bool IsAssignableIdentifier(ExpressionT expression) { |
1187 if (!Traits::IsIdentifier(expression)) return false; | 1187 if (!impl()->IsIdentifier(expression)) return false; |
1188 if (is_strict(language_mode()) && | 1188 if (is_strict(language_mode()) && |
1189 Traits::IsEvalOrArguments(Traits::AsIdentifier(expression))) { | 1189 impl()->IsEvalOrArguments(impl()->AsIdentifier(expression))) { |
1190 return false; | 1190 return false; |
1191 } | 1191 } |
1192 return true; | 1192 return true; |
1193 } | 1193 } |
1194 | 1194 |
1195 bool IsValidPattern(ExpressionT expression) { | 1195 bool IsValidPattern(ExpressionT expression) { |
1196 return expression->IsObjectLiteral() || expression->IsArrayLiteral(); | 1196 return expression->IsObjectLiteral() || expression->IsArrayLiteral(); |
1197 } | 1197 } |
1198 | 1198 |
1199 // Keep track of eval() calls since they disable all local variable | 1199 // Keep track of eval() calls since they disable all local variable |
1200 // optimizations. This checks if expression is an eval call, and if yes, | 1200 // optimizations. This checks if expression is an eval call, and if yes, |
1201 // forwards the information to scope. | 1201 // forwards the information to scope. |
1202 Call::PossiblyEval CheckPossibleEvalCall(ExpressionT expression, | 1202 Call::PossiblyEval CheckPossibleEvalCall(ExpressionT expression, |
1203 Scope* scope) { | 1203 Scope* scope) { |
1204 if (Traits::IsIdentifier(expression) && | 1204 if (impl()->IsIdentifier(expression) && |
1205 Traits::IsEval(Traits::AsIdentifier(expression))) { | 1205 impl()->IsEval(impl()->AsIdentifier(expression))) { |
1206 scope->RecordEvalCall(); | 1206 scope->RecordEvalCall(); |
1207 if (is_sloppy(scope->language_mode())) { | 1207 if (is_sloppy(scope->language_mode())) { |
1208 // For sloppy scopes we also have to record the call at function level, | 1208 // For sloppy scopes we also have to record the call at function level, |
1209 // in case it includes declarations that will be hoisted. | 1209 // in case it includes declarations that will be hoisted. |
1210 scope->GetDeclarationScope()->RecordEvalCall(); | 1210 scope->GetDeclarationScope()->RecordEvalCall(); |
1211 } | 1211 } |
1212 return Call::IS_POSSIBLY_EVAL; | 1212 return Call::IS_POSSIBLY_EVAL; |
1213 } | 1213 } |
1214 return Call::NOT_EVAL; | 1214 return Call::NOT_EVAL; |
1215 } | 1215 } |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1438 Token::Value next = Next(); | 1438 Token::Value next = Next(); |
1439 if (next == Token::IDENTIFIER || next == Token::ASYNC || | 1439 if (next == Token::IDENTIFIER || next == Token::ASYNC || |
1440 (next == Token::AWAIT && !parsing_module_ && !is_async_function())) { | 1440 (next == Token::AWAIT && !parsing_module_ && !is_async_function())) { |
1441 IdentifierT name = this->GetSymbol(scanner()); | 1441 IdentifierT name = this->GetSymbol(scanner()); |
1442 // When this function is used to read a formal parameter, we don't always | 1442 // When this function is used to read a formal parameter, we don't always |
1443 // know whether the function is going to be strict or sloppy. Indeed for | 1443 // know whether the function is going to be strict or sloppy. Indeed for |
1444 // arrow functions we don't always know that the identifier we are reading | 1444 // arrow functions we don't always know that the identifier we are reading |
1445 // is actually a formal parameter. Therefore besides the errors that we | 1445 // is actually a formal parameter. Therefore besides the errors that we |
1446 // must detect because we know we're in strict mode, we also record any | 1446 // must detect because we know we're in strict mode, we also record any |
1447 // error that we might make in the future once we know the language mode. | 1447 // error that we might make in the future once we know the language mode. |
1448 if (this->IsEvalOrArguments(name)) { | 1448 if (impl()->IsEvalOrArguments(name)) { |
1449 classifier->RecordStrictModeFormalParameterError( | 1449 classifier->RecordStrictModeFormalParameterError( |
1450 scanner()->location(), MessageTemplate::kStrictEvalArguments); | 1450 scanner()->location(), MessageTemplate::kStrictEvalArguments); |
1451 if (is_strict(language_mode())) { | 1451 if (is_strict(language_mode())) { |
1452 classifier->RecordBindingPatternError( | 1452 classifier->RecordBindingPatternError( |
1453 scanner()->location(), MessageTemplate::kStrictEvalArguments); | 1453 scanner()->location(), MessageTemplate::kStrictEvalArguments); |
1454 } | 1454 } |
1455 } else if (next == Token::AWAIT) { | 1455 } else if (next == Token::AWAIT) { |
1456 classifier->RecordAsyncArrowFormalParametersError( | 1456 classifier->RecordAsyncArrowFormalParametersError( |
1457 scanner()->location(), MessageTemplate::kAwaitBindingIdentifier); | 1457 scanner()->location(), MessageTemplate::kAwaitBindingIdentifier); |
1458 } | 1458 } |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1658 int expr_pos = peek_position(); | 1658 int expr_pos = peek_position(); |
1659 classifier->RecordExpressionError(scanner()->location(), | 1659 classifier->RecordExpressionError(scanner()->location(), |
1660 MessageTemplate::kUnexpectedToken, | 1660 MessageTemplate::kUnexpectedToken, |
1661 Token::String(Token::ELLIPSIS)); | 1661 Token::String(Token::ELLIPSIS)); |
1662 classifier->RecordNonSimpleParameter(); | 1662 classifier->RecordNonSimpleParameter(); |
1663 ExpressionClassifier binding_classifier(this); | 1663 ExpressionClassifier binding_classifier(this); |
1664 ExpressionT expr = this->ParseAssignmentExpression( | 1664 ExpressionT expr = this->ParseAssignmentExpression( |
1665 true, &binding_classifier, CHECK_OK); | 1665 true, &binding_classifier, CHECK_OK); |
1666 classifier->Accumulate(&binding_classifier, | 1666 classifier->Accumulate(&binding_classifier, |
1667 ExpressionClassifier::AllProductions); | 1667 ExpressionClassifier::AllProductions); |
1668 if (!this->IsIdentifier(expr) && !IsValidPattern(expr)) { | 1668 if (!impl()->IsIdentifier(expr) && !IsValidPattern(expr)) { |
1669 classifier->RecordArrowFormalParametersError( | 1669 classifier->RecordArrowFormalParametersError( |
1670 Scanner::Location(ellipsis_pos, scanner()->location().end_pos), | 1670 Scanner::Location(ellipsis_pos, scanner()->location().end_pos), |
1671 MessageTemplate::kInvalidRestParameter); | 1671 MessageTemplate::kInvalidRestParameter); |
1672 } | 1672 } |
1673 if (peek() == Token::COMMA) { | 1673 if (peek() == Token::COMMA) { |
1674 ReportMessageAt(scanner()->peek_location(), | 1674 ReportMessageAt(scanner()->peek_location(), |
1675 MessageTemplate::kParamAfterRest); | 1675 MessageTemplate::kParamAfterRest); |
1676 *ok = false; | 1676 *ok = false; |
1677 return this->EmptyExpression(); | 1677 return this->EmptyExpression(); |
1678 } | 1678 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 // Expression ',' AssignmentExpression | 1751 // Expression ',' AssignmentExpression |
1752 | 1752 |
1753 ExpressionT result; | 1753 ExpressionT result; |
1754 { | 1754 { |
1755 ExpressionClassifier binding_classifier(this); | 1755 ExpressionClassifier binding_classifier(this); |
1756 result = this->ParseAssignmentExpression(accept_IN, &binding_classifier, | 1756 result = this->ParseAssignmentExpression(accept_IN, &binding_classifier, |
1757 CHECK_OK); | 1757 CHECK_OK); |
1758 classifier->Accumulate(&binding_classifier, | 1758 classifier->Accumulate(&binding_classifier, |
1759 ExpressionClassifier::AllProductions); | 1759 ExpressionClassifier::AllProductions); |
1760 } | 1760 } |
1761 bool is_simple_parameter_list = this->IsIdentifier(result); | 1761 bool is_simple_parameter_list = impl()->IsIdentifier(result); |
1762 bool seen_rest = false; | 1762 bool seen_rest = false; |
1763 while (peek() == Token::COMMA) { | 1763 while (peek() == Token::COMMA) { |
1764 CheckNoTailCallExpressions(classifier, CHECK_OK); | 1764 CheckNoTailCallExpressions(classifier, CHECK_OK); |
1765 if (seen_rest) { | 1765 if (seen_rest) { |
1766 // At this point the production can't possibly be valid, but we don't know | 1766 // At this point the production can't possibly be valid, but we don't know |
1767 // which error to signal. | 1767 // which error to signal. |
1768 classifier->RecordArrowFormalParametersError( | 1768 classifier->RecordArrowFormalParametersError( |
1769 scanner()->peek_location(), MessageTemplate::kParamAfterRest); | 1769 scanner()->peek_location(), MessageTemplate::kParamAfterRest); |
1770 } | 1770 } |
1771 Consume(Token::COMMA); | 1771 Consume(Token::COMMA); |
(...skipping 11 matching lines...) Expand all Loading... |
1783 Consume(Token::ELLIPSIS); | 1783 Consume(Token::ELLIPSIS); |
1784 seen_rest = is_rest = true; | 1784 seen_rest = is_rest = true; |
1785 } | 1785 } |
1786 int pos = position(), expr_pos = peek_position(); | 1786 int pos = position(), expr_pos = peek_position(); |
1787 ExpressionClassifier binding_classifier(this); | 1787 ExpressionClassifier binding_classifier(this); |
1788 ExpressionT right = this->ParseAssignmentExpression( | 1788 ExpressionT right = this->ParseAssignmentExpression( |
1789 accept_IN, &binding_classifier, CHECK_OK); | 1789 accept_IN, &binding_classifier, CHECK_OK); |
1790 classifier->Accumulate(&binding_classifier, | 1790 classifier->Accumulate(&binding_classifier, |
1791 ExpressionClassifier::AllProductions); | 1791 ExpressionClassifier::AllProductions); |
1792 if (is_rest) { | 1792 if (is_rest) { |
1793 if (!this->IsIdentifier(right) && !IsValidPattern(right)) { | 1793 if (!impl()->IsIdentifier(right) && !IsValidPattern(right)) { |
1794 classifier->RecordArrowFormalParametersError( | 1794 classifier->RecordArrowFormalParametersError( |
1795 Scanner::Location(pos, scanner()->location().end_pos), | 1795 Scanner::Location(pos, scanner()->location().end_pos), |
1796 MessageTemplate::kInvalidRestParameter); | 1796 MessageTemplate::kInvalidRestParameter); |
1797 } | 1797 } |
1798 right = factory()->NewSpread(right, pos, expr_pos); | 1798 right = factory()->NewSpread(right, pos, expr_pos); |
1799 } | 1799 } |
1800 is_simple_parameter_list = | 1800 is_simple_parameter_list = |
1801 is_simple_parameter_list && this->IsIdentifier(right); | 1801 is_simple_parameter_list && impl()->IsIdentifier(right); |
1802 result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos); | 1802 result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos); |
1803 } | 1803 } |
1804 if (!is_simple_parameter_list || seen_rest) { | 1804 if (!is_simple_parameter_list || seen_rest) { |
1805 classifier->RecordNonSimpleParameter(); | 1805 classifier->RecordNonSimpleParameter(); |
1806 } | 1806 } |
1807 | 1807 |
1808 return result; | 1808 return result; |
1809 } | 1809 } |
1810 | 1810 |
1811 template <typename Impl> | 1811 template <typename Impl> |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1929 return expression; | 1929 return expression; |
1930 } | 1930 } |
1931 | 1931 |
1932 default: | 1932 default: |
1933 *name = ParseIdentifierName(CHECK_OK); | 1933 *name = ParseIdentifierName(CHECK_OK); |
1934 scanner()->IsGetOrSet(is_get, is_set); | 1934 scanner()->IsGetOrSet(is_get, is_set); |
1935 break; | 1935 break; |
1936 } | 1936 } |
1937 | 1937 |
1938 uint32_t index; | 1938 uint32_t index; |
1939 return this->IsArrayIndex(*name, &index) | 1939 return impl()->IsArrayIndex(*name, &index) |
1940 ? factory()->NewNumberLiteral(index, pos) | 1940 ? factory()->NewNumberLiteral(index, pos) |
1941 : factory()->NewStringLiteral(*name, pos); | 1941 : factory()->NewStringLiteral(*name, pos); |
1942 } | 1942 } |
1943 | 1943 |
1944 template <typename Impl> | 1944 template <typename Impl> |
1945 typename ParserBase<Impl>::ObjectLiteralPropertyT | 1945 typename ParserBase<Impl>::ObjectLiteralPropertyT |
1946 ParserBase<Impl>::ParsePropertyDefinition( | 1946 ParserBase<Impl>::ParsePropertyDefinition( |
1947 ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, | 1947 ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, |
1948 MethodKind method_kind, bool* is_computed_name, bool* has_seen_constructor, | 1948 MethodKind method_kind, bool* is_computed_name, bool* has_seen_constructor, |
1949 ExpressionClassifier* classifier, IdentifierT* name, bool* ok) { | 1949 ExpressionClassifier* classifier, IdentifierT* name, bool* ok) { |
(...skipping 15 matching lines...) Expand all Loading... |
1965 is_async = true; | 1965 is_async = true; |
1966 } | 1966 } |
1967 | 1967 |
1968 int next_beg_pos = scanner()->peek_location().beg_pos; | 1968 int next_beg_pos = scanner()->peek_location().beg_pos; |
1969 int next_end_pos = scanner()->peek_location().end_pos; | 1969 int next_end_pos = scanner()->peek_location().end_pos; |
1970 ExpressionT name_expression = | 1970 ExpressionT name_expression = |
1971 ParsePropertyName(name, &is_get, &is_set, is_computed_name, classifier, | 1971 ParsePropertyName(name, &is_get, &is_set, is_computed_name, classifier, |
1972 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 1972 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
1973 | 1973 |
1974 if (fni_ != nullptr && !*is_computed_name) { | 1974 if (fni_ != nullptr && !*is_computed_name) { |
1975 this->PushLiteralName(fni_, *name); | 1975 impl()->PushLiteralName(fni_, *name); |
1976 } | 1976 } |
1977 | 1977 |
1978 if (!in_class && !is_generator) { | 1978 if (!in_class && !is_generator) { |
1979 DCHECK(!IsStaticMethod(method_kind)); | 1979 DCHECK(!IsStaticMethod(method_kind)); |
1980 if (peek() == Token::COLON) { | 1980 if (peek() == Token::COLON) { |
1981 // PropertyDefinition | 1981 // PropertyDefinition |
1982 // PropertyName ':' AssignmentExpression | 1982 // PropertyName ':' AssignmentExpression |
1983 if (!*is_computed_name) { | 1983 if (!*is_computed_name) { |
1984 checker->CheckProperty(name_token, kValueProperty, MethodKind::kNormal, | 1984 checker->CheckProperty(name_token, kValueProperty, MethodKind::kNormal, |
1985 classifier, | 1985 classifier, |
(...skipping 18 matching lines...) Expand all Loading... |
2004 // IdentifierReference | 2004 // IdentifierReference |
2005 // CoverInitializedName | 2005 // CoverInitializedName |
2006 // | 2006 // |
2007 // CoverInitializedName | 2007 // CoverInitializedName |
2008 // IdentifierReference Initializer? | 2008 // IdentifierReference Initializer? |
2009 if (classifier->duplicate_finder() != nullptr && | 2009 if (classifier->duplicate_finder() != nullptr && |
2010 scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) { | 2010 scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) { |
2011 classifier->RecordDuplicateFormalParameterError(scanner()->location()); | 2011 classifier->RecordDuplicateFormalParameterError(scanner()->location()); |
2012 } | 2012 } |
2013 | 2013 |
2014 if (this->IsEvalOrArguments(*name) && is_strict(language_mode())) { | 2014 if (impl()->IsEvalOrArguments(*name) && is_strict(language_mode())) { |
2015 classifier->RecordBindingPatternError( | 2015 classifier->RecordBindingPatternError( |
2016 scanner()->location(), MessageTemplate::kStrictEvalArguments); | 2016 scanner()->location(), MessageTemplate::kStrictEvalArguments); |
2017 } | 2017 } |
2018 | 2018 |
2019 if (name_token == Token::LET) { | 2019 if (name_token == Token::LET) { |
2020 classifier->RecordLetPatternError( | 2020 classifier->RecordLetPatternError( |
2021 scanner()->location(), MessageTemplate::kLetInLexicalBinding); | 2021 scanner()->location(), MessageTemplate::kLetInLexicalBinding); |
2022 } | 2022 } |
2023 if (name_token == Token::AWAIT) { | 2023 if (name_token == Token::AWAIT) { |
2024 DCHECK(!is_async_function()); | 2024 DCHECK(!is_async_function()); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2081 classifier, | 2081 classifier, |
2082 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2082 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
2083 } | 2083 } |
2084 | 2084 |
2085 FunctionKind kind = is_generator | 2085 FunctionKind kind = is_generator |
2086 ? FunctionKind::kConciseGeneratorMethod | 2086 ? FunctionKind::kConciseGeneratorMethod |
2087 : is_async ? FunctionKind::kAsyncConciseMethod | 2087 : is_async ? FunctionKind::kAsyncConciseMethod |
2088 : FunctionKind::kConciseMethod; | 2088 : FunctionKind::kConciseMethod; |
2089 | 2089 |
2090 if (in_class && !IsStaticMethod(method_kind) && | 2090 if (in_class && !IsStaticMethod(method_kind) && |
2091 this->IsConstructor(*name)) { | 2091 impl()->IsConstructor(*name)) { |
2092 *has_seen_constructor = true; | 2092 *has_seen_constructor = true; |
2093 kind = has_extends ? FunctionKind::kSubclassConstructor | 2093 kind = has_extends ? FunctionKind::kSubclassConstructor |
2094 : FunctionKind::kBaseConstructor; | 2094 : FunctionKind::kBaseConstructor; |
2095 } | 2095 } |
2096 | 2096 |
2097 ExpressionT value = impl()->ParseFunctionLiteral( | 2097 ExpressionT value = impl()->ParseFunctionLiteral( |
2098 *name, scanner()->location(), kSkipFunctionNameCheck, kind, | 2098 *name, scanner()->location(), kSkipFunctionNameCheck, kind, |
2099 kNoSourcePosition, FunctionLiteral::kAccessorOrMethod, language_mode(), | 2099 kNoSourcePosition, FunctionLiteral::kAccessorOrMethod, language_mode(), |
2100 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2100 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
2101 | 2101 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2183 IdentifierT name = this->EmptyIdentifier(); | 2183 IdentifierT name = this->EmptyIdentifier(); |
2184 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | 2184 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( |
2185 &checker, in_class, has_extends, MethodKind::kNormal, &is_computed_name, | 2185 &checker, in_class, has_extends, MethodKind::kNormal, &is_computed_name, |
2186 NULL, classifier, &name, CHECK_OK); | 2186 NULL, classifier, &name, CHECK_OK); |
2187 | 2187 |
2188 if (is_computed_name) { | 2188 if (is_computed_name) { |
2189 has_computed_names = true; | 2189 has_computed_names = true; |
2190 } | 2190 } |
2191 | 2191 |
2192 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. | 2192 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. |
2193 if (!has_computed_names && this->IsBoilerplateProperty(property)) { | 2193 if (!has_computed_names && impl()->IsBoilerplateProperty(property)) { |
2194 number_of_boilerplate_properties++; | 2194 number_of_boilerplate_properties++; |
2195 } | 2195 } |
2196 properties->Add(property, zone()); | 2196 properties->Add(property, zone()); |
2197 | 2197 |
2198 if (peek() != Token::RBRACE) { | 2198 if (peek() != Token::RBRACE) { |
2199 // Need {} because of the CHECK_OK macro. | 2199 // Need {} because of the CHECK_OK macro. |
2200 Expect(Token::COMMA, CHECK_OK); | 2200 Expect(Token::COMMA, CHECK_OK); |
2201 } | 2201 } |
2202 | 2202 |
2203 if (fni_ != nullptr) fni_->Infer(); | 2203 if (fni_ != nullptr) fni_->Infer(); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2335 // that we have only a trivial expression to parse. | 2335 // that we have only a trivial expression to parse. |
2336 ExpressionT expression; | 2336 ExpressionT expression; |
2337 if (IsTrivialExpression()) { | 2337 if (IsTrivialExpression()) { |
2338 expression = this->ParsePrimaryExpression(&arrow_formals_classifier, | 2338 expression = this->ParsePrimaryExpression(&arrow_formals_classifier, |
2339 &is_async, CHECK_OK); | 2339 &is_async, CHECK_OK); |
2340 } else { | 2340 } else { |
2341 expression = this->ParseConditionalExpression( | 2341 expression = this->ParseConditionalExpression( |
2342 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2342 accept_IN, &arrow_formals_classifier, CHECK_OK); |
2343 } | 2343 } |
2344 | 2344 |
2345 if (is_async && this->IsIdentifier(expression) && peek_any_identifier() && | 2345 if (is_async && impl()->IsIdentifier(expression) && peek_any_identifier() && |
2346 PeekAhead() == Token::ARROW) { | 2346 PeekAhead() == Token::ARROW) { |
2347 // async Identifier => AsyncConciseBody | 2347 // async Identifier => AsyncConciseBody |
2348 IdentifierT name = | 2348 IdentifierT name = |
2349 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); | 2349 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); |
2350 expression = this->ExpressionFromIdentifier( | 2350 expression = this->ExpressionFromIdentifier( |
2351 name, position(), scanner()->location().end_pos, InferName::kNo); | 2351 name, position(), scanner()->location().end_pos, InferName::kNo); |
2352 if (fni_) { | 2352 if (fni_) { |
2353 // Remove `async` keyword from inferred name stack. | 2353 // Remove `async` keyword from inferred name stack. |
2354 fni_->RemoveAsyncKeywordFromEnd(); | 2354 fni_->RemoveAsyncKeywordFromEnd(); |
2355 } | 2355 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2410 // Do not merge pending non-pattern expressions yet! | 2410 // Do not merge pending non-pattern expressions yet! |
2411 unsigned productions = | 2411 unsigned productions = |
2412 ExpressionClassifier::FormalParametersProductions | | 2412 ExpressionClassifier::FormalParametersProductions | |
2413 ExpressionClassifier::AsyncArrowFormalParametersProduction | | 2413 ExpressionClassifier::AsyncArrowFormalParametersProduction | |
2414 ExpressionClassifier::FormalParameterInitializerProduction; | 2414 ExpressionClassifier::FormalParameterInitializerProduction; |
2415 | 2415 |
2416 // Parenthesized identifiers and property references are allowed as part | 2416 // Parenthesized identifiers and property references are allowed as part |
2417 // of a larger binding pattern, even though parenthesized patterns | 2417 // of a larger binding pattern, even though parenthesized patterns |
2418 // themselves are not allowed, e.g., "[(x)] = []". Only accumulate | 2418 // themselves are not allowed, e.g., "[(x)] = []". Only accumulate |
2419 // assignment pattern errors if the parsed expression is more complex. | 2419 // assignment pattern errors if the parsed expression is more complex. |
2420 if (this->IsValidReferenceExpression(expression)) { | 2420 if (IsValidReferenceExpression(expression)) { |
2421 productions |= ExpressionClassifier::PatternProductions & | 2421 productions |= ExpressionClassifier::PatternProductions & |
2422 ~ExpressionClassifier::AssignmentPatternProduction; | 2422 ~ExpressionClassifier::AssignmentPatternProduction; |
2423 } else { | 2423 } else { |
2424 productions |= ExpressionClassifier::PatternProductions; | 2424 productions |= ExpressionClassifier::PatternProductions; |
2425 } | 2425 } |
2426 | 2426 |
2427 const bool is_destructuring_assignment = | 2427 const bool is_destructuring_assignment = |
2428 IsValidPattern(expression) && peek() == Token::ASSIGN; | 2428 IsValidPattern(expression) && peek() == Token::ASSIGN; |
2429 if (!is_destructuring_assignment) { | 2429 if (!is_destructuring_assignment) { |
2430 // This may be an expression or a pattern, so we must continue to | 2430 // This may be an expression or a pattern, so we must continue to |
(...skipping 17 matching lines...) Expand all Loading... |
2448 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2448 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2449 | 2449 |
2450 if (is_destructuring_assignment) { | 2450 if (is_destructuring_assignment) { |
2451 ValidateAssignmentPattern(classifier, CHECK_OK); | 2451 ValidateAssignmentPattern(classifier, CHECK_OK); |
2452 } else { | 2452 } else { |
2453 expression = this->CheckAndRewriteReferenceExpression( | 2453 expression = this->CheckAndRewriteReferenceExpression( |
2454 expression, lhs_beg_pos, scanner()->location().end_pos, | 2454 expression, lhs_beg_pos, scanner()->location().end_pos, |
2455 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); | 2455 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); |
2456 } | 2456 } |
2457 | 2457 |
2458 expression = this->MarkExpressionAsAssigned(expression); | 2458 expression = impl()->MarkExpressionAsAssigned(expression); |
2459 | 2459 |
2460 Token::Value op = Next(); // Get assignment operator. | 2460 Token::Value op = Next(); // Get assignment operator. |
2461 if (op != Token::ASSIGN) { | 2461 if (op != Token::ASSIGN) { |
2462 classifier->RecordPatternError(scanner()->location(), | 2462 classifier->RecordPatternError(scanner()->location(), |
2463 MessageTemplate::kUnexpectedToken, | 2463 MessageTemplate::kUnexpectedToken, |
2464 Token::String(op)); | 2464 Token::String(op)); |
2465 } | 2465 } |
2466 int pos = position(); | 2466 int pos = position(); |
2467 | 2467 |
2468 ExpressionClassifier rhs_classifier(this); | 2468 ExpressionClassifier rhs_classifier(this); |
2469 | 2469 |
2470 ExpressionT right = | 2470 ExpressionT right = |
2471 this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); | 2471 this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); |
2472 CheckNoTailCallExpressions(&rhs_classifier, CHECK_OK); | 2472 CheckNoTailCallExpressions(&rhs_classifier, CHECK_OK); |
2473 impl()->RewriteNonPattern(&rhs_classifier, CHECK_OK); | 2473 impl()->RewriteNonPattern(&rhs_classifier, CHECK_OK); |
2474 classifier->Accumulate( | 2474 classifier->Accumulate( |
2475 &rhs_classifier, | 2475 &rhs_classifier, |
2476 ExpressionClassifier::ExpressionProductions | | 2476 ExpressionClassifier::ExpressionProductions | |
2477 ExpressionClassifier::ObjectLiteralProduction | | 2477 ExpressionClassifier::ObjectLiteralProduction | |
2478 ExpressionClassifier::AsyncArrowFormalParametersProduction); | 2478 ExpressionClassifier::AsyncArrowFormalParametersProduction); |
2479 | 2479 |
2480 // TODO(1231235): We try to estimate the set of properties set by | 2480 // TODO(1231235): We try to estimate the set of properties set by |
2481 // constructors. We define a new property whenever there is an | 2481 // constructors. We define a new property whenever there is an |
2482 // assignment to a property of 'this'. We should probably only add | 2482 // assignment to a property of 'this'. We should probably only add |
2483 // properties if we haven't seen them before. Otherwise we'll | 2483 // properties if we haven't seen them before. Otherwise we'll |
2484 // probably overestimate the number of properties. | 2484 // probably overestimate the number of properties. |
2485 if (op == Token::ASSIGN && this->IsThisProperty(expression)) { | 2485 if (op == Token::ASSIGN && impl()->IsThisProperty(expression)) { |
2486 function_state_->AddProperty(); | 2486 function_state_->AddProperty(); |
2487 } | 2487 } |
2488 | 2488 |
2489 this->CheckAssigningFunctionLiteralToProperty(expression, right); | 2489 impl()->CheckAssigningFunctionLiteralToProperty(expression, right); |
2490 | 2490 |
2491 if (fni_ != NULL) { | 2491 if (fni_ != NULL) { |
2492 // Check if the right hand side is a call to avoid inferring a | 2492 // Check if the right hand side is a call to avoid inferring a |
2493 // name if we're dealing with "a = function(){...}();"-like | 2493 // name if we're dealing with "a = function(){...}();"-like |
2494 // expression. | 2494 // expression. |
2495 if ((op == Token::INIT || op == Token::ASSIGN) && | 2495 if ((op == Token::INIT || op == Token::ASSIGN) && |
2496 (!right->IsCall() && !right->IsCallNew())) { | 2496 (!right->IsCall() && !right->IsCallNew())) { |
2497 fni_->Infer(); | 2497 fni_->Infer(); |
2498 } else { | 2498 } else { |
2499 fni_->RemoveLastFunction(); | 2499 fni_->RemoveLastFunction(); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2586 this->ParseLeftHandSideExpression(classifier, CHECK_OK); | 2586 this->ParseLeftHandSideExpression(classifier, CHECK_OK); |
2587 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2587 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2588 | 2588 |
2589 Scanner::Location loc(pos, scanner()->location().end_pos); | 2589 Scanner::Location loc(pos, scanner()->location().end_pos); |
2590 if (!expression->IsCall()) { | 2590 if (!expression->IsCall()) { |
2591 Scanner::Location sub_loc(sub_expression_pos, loc.end_pos); | 2591 Scanner::Location sub_loc(sub_expression_pos, loc.end_pos); |
2592 ReportMessageAt(sub_loc, MessageTemplate::kUnexpectedInsideTailCall); | 2592 ReportMessageAt(sub_loc, MessageTemplate::kUnexpectedInsideTailCall); |
2593 *ok = false; | 2593 *ok = false; |
2594 return Traits::EmptyExpression(); | 2594 return Traits::EmptyExpression(); |
2595 } | 2595 } |
2596 if (Traits::IsDirectEvalCall(expression)) { | 2596 if (impl()->IsDirectEvalCall(expression)) { |
2597 Scanner::Location sub_loc(sub_expression_pos, loc.end_pos); | 2597 Scanner::Location sub_loc(sub_expression_pos, loc.end_pos); |
2598 ReportMessageAt(sub_loc, MessageTemplate::kUnexpectedTailCallOfEval); | 2598 ReportMessageAt(sub_loc, MessageTemplate::kUnexpectedTailCallOfEval); |
2599 *ok = false; | 2599 *ok = false; |
2600 return Traits::EmptyExpression(); | 2600 return Traits::EmptyExpression(); |
2601 } | 2601 } |
2602 if (!is_strict(language_mode())) { | 2602 if (!is_strict(language_mode())) { |
2603 ReportMessageAt(loc, MessageTemplate::kUnexpectedSloppyTailCall); | 2603 ReportMessageAt(loc, MessageTemplate::kUnexpectedSloppyTailCall); |
2604 *ok = false; | 2604 *ok = false; |
2605 return Traits::EmptyExpression(); | 2605 return Traits::EmptyExpression(); |
2606 } | 2606 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2683 | 2683 |
2684 const bool is_right_associative = op == Token::EXP; | 2684 const bool is_right_associative = op == Token::EXP; |
2685 const int next_prec = is_right_associative ? prec1 : prec1 + 1; | 2685 const int next_prec = is_right_associative ? prec1 : prec1 + 1; |
2686 ExpressionT y = | 2686 ExpressionT y = |
2687 ParseBinaryExpression(next_prec, accept_IN, classifier, CHECK_OK); | 2687 ParseBinaryExpression(next_prec, accept_IN, classifier, CHECK_OK); |
2688 if (op != Token::OR && op != Token::AND) { | 2688 if (op != Token::OR && op != Token::AND) { |
2689 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2689 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2690 } | 2690 } |
2691 impl()->RewriteNonPattern(classifier, CHECK_OK); | 2691 impl()->RewriteNonPattern(classifier, CHECK_OK); |
2692 | 2692 |
2693 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, | 2693 if (impl()->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos)) { |
2694 factory())) { | |
2695 continue; | 2694 continue; |
2696 } | 2695 } |
2697 | 2696 |
2698 // For now we distinguish between comparisons and other binary | 2697 // For now we distinguish between comparisons and other binary |
2699 // operations. (We could combine the two and get rid of this | 2698 // operations. (We could combine the two and get rid of this |
2700 // code and AST node eventually.) | 2699 // code and AST node eventually.) |
2701 if (Token::IsCompareOp(op)) { | 2700 if (Token::IsCompareOp(op)) { |
2702 // We have a comparison. | 2701 // We have a comparison. |
2703 Token::Value cmp = op; | 2702 Token::Value cmp = op; |
2704 switch (op) { | 2703 switch (op) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2743 BindingPatternUnexpectedToken(classifier); | 2742 BindingPatternUnexpectedToken(classifier); |
2744 ArrowFormalParametersUnexpectedToken(classifier); | 2743 ArrowFormalParametersUnexpectedToken(classifier); |
2745 | 2744 |
2746 op = Next(); | 2745 op = Next(); |
2747 int pos = position(); | 2746 int pos = position(); |
2748 ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK); | 2747 ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK); |
2749 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2748 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2750 impl()->RewriteNonPattern(classifier, CHECK_OK); | 2749 impl()->RewriteNonPattern(classifier, CHECK_OK); |
2751 | 2750 |
2752 if (op == Token::DELETE && is_strict(language_mode())) { | 2751 if (op == Token::DELETE && is_strict(language_mode())) { |
2753 if (this->IsIdentifier(expression)) { | 2752 if (impl()->IsIdentifier(expression)) { |
2754 // "delete identifier" is a syntax error in strict mode. | 2753 // "delete identifier" is a syntax error in strict mode. |
2755 ReportMessage(MessageTemplate::kStrictDelete); | 2754 ReportMessage(MessageTemplate::kStrictDelete); |
2756 *ok = false; | 2755 *ok = false; |
2757 return this->EmptyExpression(); | 2756 return this->EmptyExpression(); |
2758 } | 2757 } |
2759 } | 2758 } |
2760 | 2759 |
2761 if (peek() == Token::EXP) { | 2760 if (peek() == Token::EXP) { |
2762 ReportUnexpectedToken(Next()); | 2761 ReportUnexpectedToken(Next()); |
2763 *ok = false; | 2762 *ok = false; |
2764 return this->EmptyExpression(); | 2763 return this->EmptyExpression(); |
2765 } | 2764 } |
2766 | 2765 |
2767 // Allow Traits do rewrite the expression. | 2766 // Allow Traits do rewrite the expression. |
2768 return this->BuildUnaryExpression(expression, op, pos, factory()); | 2767 return this->BuildUnaryExpression(expression, op, pos, factory()); |
2769 } else if (Token::IsCountOp(op)) { | 2768 } else if (Token::IsCountOp(op)) { |
2770 BindingPatternUnexpectedToken(classifier); | 2769 BindingPatternUnexpectedToken(classifier); |
2771 ArrowFormalParametersUnexpectedToken(classifier); | 2770 ArrowFormalParametersUnexpectedToken(classifier); |
2772 op = Next(); | 2771 op = Next(); |
2773 int beg_pos = peek_position(); | 2772 int beg_pos = peek_position(); |
2774 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); | 2773 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); |
2775 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2774 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2776 expression = this->CheckAndRewriteReferenceExpression( | 2775 expression = this->CheckAndRewriteReferenceExpression( |
2777 expression, beg_pos, scanner()->location().end_pos, | 2776 expression, beg_pos, scanner()->location().end_pos, |
2778 MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK); | 2777 MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK); |
2779 this->MarkExpressionAsAssigned(expression); | 2778 expression = impl()->MarkExpressionAsAssigned(expression); |
2780 impl()->RewriteNonPattern(classifier, CHECK_OK); | 2779 impl()->RewriteNonPattern(classifier, CHECK_OK); |
2781 | 2780 |
2782 return factory()->NewCountOperation(op, | 2781 return factory()->NewCountOperation(op, |
2783 true /* prefix */, | 2782 true /* prefix */, |
2784 expression, | 2783 expression, |
2785 position()); | 2784 position()); |
2786 | 2785 |
2787 } else if (is_async_function() && peek() == Token::AWAIT) { | 2786 } else if (is_async_function() && peek() == Token::AWAIT) { |
2788 classifier->RecordFormalParameterInitializerError( | 2787 classifier->RecordFormalParameterInitializerError( |
2789 scanner()->peek_location(), | 2788 scanner()->peek_location(), |
(...skipping 21 matching lines...) Expand all Loading... |
2811 this->ParseLeftHandSideExpression(classifier, CHECK_OK); | 2810 this->ParseLeftHandSideExpression(classifier, CHECK_OK); |
2812 if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 2811 if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
2813 Token::IsCountOp(peek())) { | 2812 Token::IsCountOp(peek())) { |
2814 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2813 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2815 BindingPatternUnexpectedToken(classifier); | 2814 BindingPatternUnexpectedToken(classifier); |
2816 ArrowFormalParametersUnexpectedToken(classifier); | 2815 ArrowFormalParametersUnexpectedToken(classifier); |
2817 | 2816 |
2818 expression = this->CheckAndRewriteReferenceExpression( | 2817 expression = this->CheckAndRewriteReferenceExpression( |
2819 expression, lhs_beg_pos, scanner()->location().end_pos, | 2818 expression, lhs_beg_pos, scanner()->location().end_pos, |
2820 MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK); | 2819 MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK); |
2821 expression = this->MarkExpressionAsAssigned(expression); | 2820 expression = impl()->MarkExpressionAsAssigned(expression); |
2822 impl()->RewriteNonPattern(classifier, CHECK_OK); | 2821 impl()->RewriteNonPattern(classifier, CHECK_OK); |
2823 | 2822 |
2824 Token::Value next = Next(); | 2823 Token::Value next = Next(); |
2825 expression = | 2824 expression = |
2826 factory()->NewCountOperation(next, | 2825 factory()->NewCountOperation(next, |
2827 false /* postfix */, | 2826 false /* postfix */, |
2828 expression, | 2827 expression, |
2829 position()); | 2828 position()); |
2830 } | 2829 } |
2831 return expression; | 2830 return expression; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2882 pos = peek_position(); | 2881 pos = peek_position(); |
2883 // Also the trailing parenthesis are a hint that the function will | 2882 // Also the trailing parenthesis are a hint that the function will |
2884 // be called immediately. If we happen to have parsed a preceding | 2883 // be called immediately. If we happen to have parsed a preceding |
2885 // function literal eagerly, we can also compile it eagerly. | 2884 // function literal eagerly, we can also compile it eagerly. |
2886 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { | 2885 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { |
2887 result->AsFunctionLiteral()->set_should_eager_compile(); | 2886 result->AsFunctionLiteral()->set_should_eager_compile(); |
2888 } | 2887 } |
2889 } | 2888 } |
2890 Scanner::Location spread_pos; | 2889 Scanner::Location spread_pos; |
2891 typename Traits::Type::ExpressionList args; | 2890 typename Traits::Type::ExpressionList args; |
2892 if (V8_UNLIKELY(is_async && this->IsIdentifier(result))) { | 2891 if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) { |
2893 ExpressionClassifier async_classifier(this); | 2892 ExpressionClassifier async_classifier(this); |
2894 args = ParseArguments(&spread_pos, true, &async_classifier, CHECK_OK); | 2893 args = ParseArguments(&spread_pos, true, &async_classifier, CHECK_OK); |
2895 if (peek() == Token::ARROW) { | 2894 if (peek() == Token::ARROW) { |
2896 if (fni_) { | 2895 if (fni_) { |
2897 fni_->RemoveAsyncKeywordFromEnd(); | 2896 fni_->RemoveAsyncKeywordFromEnd(); |
2898 } | 2897 } |
2899 ValidateBindingPattern(&async_classifier, CHECK_OK); | 2898 ValidateBindingPattern(&async_classifier, CHECK_OK); |
2900 ValidateFormalParameterInitializer(&async_classifier, CHECK_OK); | 2899 ValidateFormalParameterInitializer(&async_classifier, CHECK_OK); |
2901 if (!async_classifier.is_valid_async_arrow_formal_parameters()) { | 2900 if (!async_classifier.is_valid_async_arrow_formal_parameters()) { |
2902 ReportClassifierError( | 2901 ReportClassifierError( |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2953 case Token::PERIOD: { | 2952 case Token::PERIOD: { |
2954 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2953 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2955 impl()->RewriteNonPattern(classifier, CHECK_OK); | 2954 impl()->RewriteNonPattern(classifier, CHECK_OK); |
2956 BindingPatternUnexpectedToken(classifier); | 2955 BindingPatternUnexpectedToken(classifier); |
2957 ArrowFormalParametersUnexpectedToken(classifier); | 2956 ArrowFormalParametersUnexpectedToken(classifier); |
2958 Consume(Token::PERIOD); | 2957 Consume(Token::PERIOD); |
2959 int pos = position(); | 2958 int pos = position(); |
2960 IdentifierT name = ParseIdentifierName(CHECK_OK); | 2959 IdentifierT name = ParseIdentifierName(CHECK_OK); |
2961 result = factory()->NewProperty( | 2960 result = factory()->NewProperty( |
2962 result, factory()->NewStringLiteral(name, pos), pos); | 2961 result, factory()->NewStringLiteral(name, pos), pos); |
2963 if (fni_ != NULL) this->PushLiteralName(fni_, name); | 2962 if (fni_ != NULL) impl()->PushLiteralName(fni_, name); |
2964 break; | 2963 break; |
2965 } | 2964 } |
2966 | 2965 |
2967 case Token::TEMPLATE_SPAN: | 2966 case Token::TEMPLATE_SPAN: |
2968 case Token::TEMPLATE_TAIL: { | 2967 case Token::TEMPLATE_TAIL: { |
2969 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2968 CheckNoTailCallExpressions(classifier, CHECK_OK); |
2970 impl()->RewriteNonPattern(classifier, CHECK_OK); | 2969 impl()->RewriteNonPattern(classifier, CHECK_OK); |
2971 BindingPatternUnexpectedToken(classifier); | 2970 BindingPatternUnexpectedToken(classifier); |
2972 ArrowFormalParametersUnexpectedToken(classifier); | 2971 ArrowFormalParametersUnexpectedToken(classifier); |
2973 result = ParseTemplateLiteral(result, position(), classifier, CHECK_OK); | 2972 result = ParseTemplateLiteral(result, position(), classifier, CHECK_OK); |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3185 impl()->RewriteNonPattern(classifier, CHECK_OK); | 3184 impl()->RewriteNonPattern(classifier, CHECK_OK); |
3186 BindingPatternUnexpectedToken(classifier); | 3185 BindingPatternUnexpectedToken(classifier); |
3187 ArrowFormalParametersUnexpectedToken(classifier); | 3186 ArrowFormalParametersUnexpectedToken(classifier); |
3188 | 3187 |
3189 Consume(Token::LBRACK); | 3188 Consume(Token::LBRACK); |
3190 int pos = position(); | 3189 int pos = position(); |
3191 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); | 3190 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); |
3192 impl()->RewriteNonPattern(classifier, CHECK_OK); | 3191 impl()->RewriteNonPattern(classifier, CHECK_OK); |
3193 expression = factory()->NewProperty(expression, index, pos); | 3192 expression = factory()->NewProperty(expression, index, pos); |
3194 if (fni_ != NULL) { | 3193 if (fni_ != NULL) { |
3195 this->PushPropertyName(fni_, index); | 3194 impl()->PushPropertyName(fni_, index); |
3196 } | 3195 } |
3197 Expect(Token::RBRACK, CHECK_OK); | 3196 Expect(Token::RBRACK, CHECK_OK); |
3198 break; | 3197 break; |
3199 } | 3198 } |
3200 case Token::PERIOD: { | 3199 case Token::PERIOD: { |
3201 *is_async = false; | 3200 *is_async = false; |
3202 impl()->RewriteNonPattern(classifier, CHECK_OK); | 3201 impl()->RewriteNonPattern(classifier, CHECK_OK); |
3203 BindingPatternUnexpectedToken(classifier); | 3202 BindingPatternUnexpectedToken(classifier); |
3204 ArrowFormalParametersUnexpectedToken(classifier); | 3203 ArrowFormalParametersUnexpectedToken(classifier); |
3205 | 3204 |
3206 Consume(Token::PERIOD); | 3205 Consume(Token::PERIOD); |
3207 int pos = position(); | 3206 int pos = position(); |
3208 IdentifierT name = ParseIdentifierName(CHECK_OK); | 3207 IdentifierT name = ParseIdentifierName(CHECK_OK); |
3209 expression = factory()->NewProperty( | 3208 expression = factory()->NewProperty( |
3210 expression, factory()->NewStringLiteral(name, pos), pos); | 3209 expression, factory()->NewStringLiteral(name, pos), pos); |
3211 if (fni_ != NULL) { | 3210 if (fni_ != NULL) { |
3212 this->PushLiteralName(fni_, name); | 3211 impl()->PushLiteralName(fni_, name); |
3213 } | 3212 } |
3214 break; | 3213 break; |
3215 } | 3214 } |
3216 case Token::TEMPLATE_SPAN: | 3215 case Token::TEMPLATE_SPAN: |
3217 case Token::TEMPLATE_TAIL: { | 3216 case Token::TEMPLATE_TAIL: { |
3218 *is_async = false; | 3217 *is_async = false; |
3219 impl()->RewriteNonPattern(classifier, CHECK_OK); | 3218 impl()->RewriteNonPattern(classifier, CHECK_OK); |
3220 BindingPatternUnexpectedToken(classifier); | 3219 BindingPatternUnexpectedToken(classifier); |
3221 ArrowFormalParametersUnexpectedToken(classifier); | 3220 ArrowFormalParametersUnexpectedToken(classifier); |
3222 int pos; | 3221 int pos; |
(...skipping 29 matching lines...) Expand all Loading... |
3252 ExpressionClassifier* classifier, | 3251 ExpressionClassifier* classifier, |
3253 bool* ok) { | 3252 bool* ok) { |
3254 // FormalParameter[Yield,GeneratorParameter] : | 3253 // FormalParameter[Yield,GeneratorParameter] : |
3255 // BindingElement[?Yield, ?GeneratorParameter] | 3254 // BindingElement[?Yield, ?GeneratorParameter] |
3256 bool is_rest = parameters->has_rest; | 3255 bool is_rest = parameters->has_rest; |
3257 | 3256 |
3258 ExpressionT pattern = | 3257 ExpressionT pattern = |
3259 ParsePrimaryExpression(classifier, CHECK_OK_CUSTOM(Void)); | 3258 ParsePrimaryExpression(classifier, CHECK_OK_CUSTOM(Void)); |
3260 ValidateBindingPattern(classifier, CHECK_OK_CUSTOM(Void)); | 3259 ValidateBindingPattern(classifier, CHECK_OK_CUSTOM(Void)); |
3261 | 3260 |
3262 if (!Traits::IsIdentifier(pattern)) { | 3261 if (!impl()->IsIdentifier(pattern)) { |
3263 parameters->is_simple = false; | 3262 parameters->is_simple = false; |
3264 ValidateFormalParameterInitializer(classifier, CHECK_OK_CUSTOM(Void)); | 3263 ValidateFormalParameterInitializer(classifier, CHECK_OK_CUSTOM(Void)); |
3265 classifier->RecordNonSimpleParameter(); | 3264 classifier->RecordNonSimpleParameter(); |
3266 } | 3265 } |
3267 | 3266 |
3268 ExpressionT initializer = Traits::EmptyExpression(); | 3267 ExpressionT initializer = Traits::EmptyExpression(); |
3269 if (!is_rest && Check(Token::ASSIGN)) { | 3268 if (!is_rest && Check(Token::ASSIGN)) { |
3270 ExpressionClassifier init_classifier(this); | 3269 ExpressionClassifier init_classifier(this); |
3271 initializer = ParseAssignmentExpression(true, &init_classifier, | 3270 initializer = ParseAssignmentExpression(true, &init_classifier, |
3272 CHECK_OK_CUSTOM(Void)); | 3271 CHECK_OK_CUSTOM(Void)); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3510 this->EmptyIdentifierString(), formal_parameters.scope, body, | 3509 this->EmptyIdentifierString(), formal_parameters.scope, body, |
3511 materialized_literal_count, expected_property_count, num_parameters, | 3510 materialized_literal_count, expected_property_count, num_parameters, |
3512 FunctionLiteral::kNoDuplicateParameters, | 3511 FunctionLiteral::kNoDuplicateParameters, |
3513 FunctionLiteral::kAnonymousExpression, | 3512 FunctionLiteral::kAnonymousExpression, |
3514 FunctionLiteral::kShouldLazyCompile, arrow_kind, | 3513 FunctionLiteral::kShouldLazyCompile, arrow_kind, |
3515 formal_parameters.scope->start_position()); | 3514 formal_parameters.scope->start_position()); |
3516 | 3515 |
3517 function_literal->set_function_token_position( | 3516 function_literal->set_function_token_position( |
3518 formal_parameters.scope->start_position()); | 3517 formal_parameters.scope->start_position()); |
3519 | 3518 |
3520 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); | 3519 if (fni_ != NULL) impl()->InferFunctionName(fni_, function_literal); |
3521 | 3520 |
3522 return function_literal; | 3521 return function_literal; |
3523 } | 3522 } |
3524 | 3523 |
3525 template <typename Impl> | 3524 template <typename Impl> |
3526 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 3525 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( |
3527 ExpressionT tag, int start, ExpressionClassifier* classifier, bool* ok) { | 3526 ExpressionT tag, int start, ExpressionClassifier* classifier, bool* ok) { |
3528 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal | 3527 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal |
3529 // text followed by a substitution expression), finalized by a single | 3528 // text followed by a substitution expression), finalized by a single |
3530 // TEMPLATE_TAIL. | 3529 // TEMPLATE_TAIL. |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3623 MessageTemplate::Template message, bool* ok) { | 3622 MessageTemplate::Template message, bool* ok) { |
3624 return this->CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, | 3623 return this->CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, |
3625 message, kReferenceError, ok); | 3624 message, kReferenceError, ok); |
3626 } | 3625 } |
3627 | 3626 |
3628 template <typename Impl> | 3627 template <typename Impl> |
3629 typename ParserBase<Impl>::ExpressionT | 3628 typename ParserBase<Impl>::ExpressionT |
3630 ParserBase<Impl>::CheckAndRewriteReferenceExpression( | 3629 ParserBase<Impl>::CheckAndRewriteReferenceExpression( |
3631 ExpressionT expression, int beg_pos, int end_pos, | 3630 ExpressionT expression, int beg_pos, int end_pos, |
3632 MessageTemplate::Template message, ParseErrorType type, bool* ok) { | 3631 MessageTemplate::Template message, ParseErrorType type, bool* ok) { |
3633 if (this->IsIdentifier(expression) && is_strict(language_mode()) && | 3632 if (impl()->IsIdentifier(expression) && is_strict(language_mode()) && |
3634 this->IsEvalOrArguments(this->AsIdentifier(expression))) { | 3633 impl()->IsEvalOrArguments(impl()->AsIdentifier(expression))) { |
3635 ReportMessageAt(Scanner::Location(beg_pos, end_pos), | 3634 ReportMessageAt(Scanner::Location(beg_pos, end_pos), |
3636 MessageTemplate::kStrictEvalArguments, kSyntaxError); | 3635 MessageTemplate::kStrictEvalArguments, kSyntaxError); |
3637 *ok = false; | 3636 *ok = false; |
3638 return this->EmptyExpression(); | 3637 return this->EmptyExpression(); |
3639 } | 3638 } |
3640 if (expression->IsValidReferenceExpression()) { | 3639 if (expression->IsValidReferenceExpression()) { |
3641 return expression; | 3640 return expression; |
3642 } | 3641 } |
3643 if (expression->IsCall()) { | 3642 if (expression->IsCall()) { |
3644 // If it is a call, make it a runtime error for legacy web compatibility. | 3643 // If it is a call, make it a runtime error for legacy web compatibility. |
3645 // Rewrite `expr' to `expr[throw ReferenceError]'. | 3644 // Rewrite `expr' to `expr[throw ReferenceError]'. |
3646 ExpressionT error = this->NewThrowReferenceError(message, beg_pos); | 3645 ExpressionT error = this->NewThrowReferenceError(message, beg_pos); |
3647 return factory()->NewProperty(expression, error, beg_pos); | 3646 return factory()->NewProperty(expression, error, beg_pos); |
3648 } | 3647 } |
3649 ReportMessageAt(Scanner::Location(beg_pos, end_pos), message, type); | 3648 ReportMessageAt(Scanner::Location(beg_pos, end_pos), message, type); |
3650 *ok = false; | 3649 *ok = false; |
3651 return this->EmptyExpression(); | 3650 return this->EmptyExpression(); |
3652 } | 3651 } |
3653 | 3652 |
3654 template <typename Impl> | 3653 template <typename Impl> |
3655 bool ParserBase<Impl>::IsValidReferenceExpression(ExpressionT expression) { | 3654 bool ParserBase<Impl>::IsValidReferenceExpression(ExpressionT expression) { |
3656 return this->IsAssignableIdentifier(expression) || expression->IsProperty(); | 3655 return IsAssignableIdentifier(expression) || expression->IsProperty(); |
3657 } | 3656 } |
3658 | 3657 |
3659 template <typename Impl> | 3658 template <typename Impl> |
3660 void ParserBase<Impl>::CheckDestructuringElement( | 3659 void ParserBase<Impl>::CheckDestructuringElement( |
3661 ExpressionT expression, ExpressionClassifier* classifier, int begin, | 3660 ExpressionT expression, ExpressionClassifier* classifier, int begin, |
3662 int end) { | 3661 int end) { |
3663 if (!IsValidPattern(expression) && !expression->IsAssignment() && | 3662 if (!IsValidPattern(expression) && !expression->IsAssignment() && |
3664 !IsValidReferenceExpression(expression)) { | 3663 !IsValidReferenceExpression(expression)) { |
3665 classifier->RecordAssignmentPatternError( | 3664 classifier->RecordAssignmentPatternError( |
3666 Scanner::Location(begin, end), | 3665 Scanner::Location(begin, end), |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3725 has_seen_constructor_ = true; | 3724 has_seen_constructor_ = true; |
3726 return; | 3725 return; |
3727 } | 3726 } |
3728 } | 3727 } |
3729 | 3728 |
3730 | 3729 |
3731 } // namespace internal | 3730 } // namespace internal |
3732 } // namespace v8 | 3731 } // namespace v8 |
3733 | 3732 |
3734 #endif // V8_PARSING_PARSER_BASE_H | 3733 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |