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/hashmap.h" | 10 #include "src/hashmap.h" |
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1030 ExpressionClassifier classifier; | 1030 ExpressionClassifier classifier; |
1031 auto result = ParseAndClassifyIdentifier(&classifier, ok); | 1031 auto result = ParseAndClassifyIdentifier(&classifier, ok); |
1032 if (!*ok) return Traits::EmptyIdentifier(); | 1032 if (!*ok) return Traits::EmptyIdentifier(); |
1033 | 1033 |
1034 if (allow_restricted_identifiers == kDontAllowRestrictedIdentifiers) { | 1034 if (allow_restricted_identifiers == kDontAllowRestrictedIdentifiers) { |
1035 ValidateAssignmentPattern(&classifier, ok); | 1035 ValidateAssignmentPattern(&classifier, ok); |
1036 if (!*ok) return Traits::EmptyIdentifier(); | 1036 if (!*ok) return Traits::EmptyIdentifier(); |
1037 ValidateBindingPattern(&classifier, ok); | 1037 ValidateBindingPattern(&classifier, ok); |
1038 if (!*ok) return Traits::EmptyIdentifier(); | 1038 if (!*ok) return Traits::EmptyIdentifier(); |
1039 } else { | 1039 } else { |
1040 #if 0 // TODO(nikolaos): is this needed? | |
rossberg
2016/01/12 13:47:52
Yes, this is needed -- ParseAndClassifyIdentifier
nickie
2016/01/12 14:12:32
Acknowledged. I'm adding a test for this.
nickie
2016/01/12 15:16:09
Cannot find a test for this. This is the "else" c
rossberg
2016/01/14 13:28:40
Yes, I don't understand why this is the else case
nickie
2016/01/14 14:47:14
In the "then" case there is some validation. But
| |
1040 ValidateExpression(&classifier, ok); | 1041 ValidateExpression(&classifier, ok); |
1041 if (!*ok) return Traits::EmptyIdentifier(); | 1042 if (!*ok) return Traits::EmptyIdentifier(); |
1043 #endif | |
1042 } | 1044 } |
1043 | 1045 |
1044 return result; | 1046 return result; |
1045 } | 1047 } |
1046 | 1048 |
1047 | 1049 |
1048 template <class Traits> | 1050 template <class Traits> |
1049 typename ParserBase<Traits>::IdentifierT | 1051 typename ParserBase<Traits>::IdentifierT |
1050 ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, | 1052 ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
1051 bool* ok) { | 1053 bool* ok) { |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1347 Expect(Token::RPAREN, CHECK_OK); | 1349 Expect(Token::RPAREN, CHECK_OK); |
1348 return factory()->NewSpread(expr, ellipsis_pos); | 1350 return factory()->NewSpread(expr, ellipsis_pos); |
1349 } | 1351 } |
1350 // Heuristically try to detect immediately called functions before | 1352 // Heuristically try to detect immediately called functions before |
1351 // seeing the call parentheses. | 1353 // seeing the call parentheses. |
1352 parenthesized_function_ = (peek() == Token::FUNCTION); | 1354 parenthesized_function_ = (peek() == Token::FUNCTION); |
1353 ExpressionT expr = this->ParseExpression(true, kIsPossibleArrowFormals, | 1355 ExpressionT expr = this->ParseExpression(true, kIsPossibleArrowFormals, |
1354 classifier, CHECK_OK); | 1356 classifier, CHECK_OK); |
1355 Expect(Token::RPAREN, CHECK_OK); | 1357 Expect(Token::RPAREN, CHECK_OK); |
1356 if (peek() != Token::ARROW) { | 1358 if (peek() != Token::ARROW) { |
1359 #if 0 // TODO(nikolaos): is this needed? | |
rossberg
2016/01/12 13:47:52
Isn't this needed to catch syntax errors like "(()
caitp (gmail)
2016/01/12 13:50:39
This is needed to catch things like CoverInitializ
nickie
2016/01/12 14:12:32
Acknowledged. I'm adding a test for this.
nickie
2016/01/12 15:16:09
Cannot find a test for this either. It seems to m
nickie
2016/01/13 10:26:06
After Caitlin's patch for parenthesized patterns,
rossberg
2016/01/14 13:28:40
Hm, I wonder if it isn't a broader shortcoming tha
nickie
2016/01/14 14:47:14
There's two approaches, as I understand it. Eithe
caitp (gmail)
2016/01/14 15:06:25
Just a note about why the ValidateExpression was o
| |
1357 ValidateExpression(classifier, CHECK_OK); | 1360 ValidateExpression(classifier, CHECK_OK); |
1361 #endif | |
1358 expr->set_is_parenthesized(); | 1362 expr->set_is_parenthesized(); |
1359 } | 1363 } |
1360 return expr; | 1364 return expr; |
1361 } | 1365 } |
1362 | 1366 |
1363 case Token::CLASS: { | 1367 case Token::CLASS: { |
1364 BindingPatternUnexpectedToken(classifier); | 1368 BindingPatternUnexpectedToken(classifier); |
1365 Consume(Token::CLASS); | 1369 Consume(Token::CLASS); |
1366 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { | 1370 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { |
1367 ReportMessage(MessageTemplate::kSloppyLexical); | 1371 ReportMessage(MessageTemplate::kSloppyLexical); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1412 *ok = false; | 1416 *ok = false; |
1413 return this->EmptyExpression(); | 1417 return this->EmptyExpression(); |
1414 } | 1418 } |
1415 | 1419 |
1416 | 1420 |
1417 template <class Traits> | 1421 template <class Traits> |
1418 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( | 1422 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
1419 bool accept_IN, bool* ok) { | 1423 bool accept_IN, bool* ok) { |
1420 ExpressionClassifier classifier; | 1424 ExpressionClassifier classifier; |
1421 ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK); | 1425 ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK); |
1422 ValidateExpression(&classifier, CHECK_OK); | 1426 result = Traits::RewriteExpression(result, &classifier, CHECK_OK); |
1423 result = Traits::RewriteExpression(result); | |
1424 return result; | 1427 return result; |
1425 } | 1428 } |
1426 | 1429 |
1427 | 1430 |
1428 template <class Traits> | 1431 template <class Traits> |
1429 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( | 1432 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
1430 bool accept_IN, ExpressionClassifier* classifier, bool* ok) { | 1433 bool accept_IN, ExpressionClassifier* classifier, bool* ok) { |
1431 return ParseExpression(accept_IN, kIsLeftHandSide, classifier, ok); | 1434 return ParseExpression(accept_IN, kIsLeftHandSide, classifier, ok); |
1432 } | 1435 } |
1433 | 1436 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1579 Consume(Token::NUMBER); | 1582 Consume(Token::NUMBER); |
1580 *name = this->GetNumberAsSymbol(scanner()); | 1583 *name = this->GetNumberAsSymbol(scanner()); |
1581 break; | 1584 break; |
1582 | 1585 |
1583 case Token::LBRACK: { | 1586 case Token::LBRACK: { |
1584 *is_computed_name = true; | 1587 *is_computed_name = true; |
1585 Consume(Token::LBRACK); | 1588 Consume(Token::LBRACK); |
1586 ExpressionClassifier computed_name_classifier; | 1589 ExpressionClassifier computed_name_classifier; |
1587 ExpressionT expression = | 1590 ExpressionT expression = |
1588 ParseAssignmentExpression(true, &computed_name_classifier, CHECK_OK); | 1591 ParseAssignmentExpression(true, &computed_name_classifier, CHECK_OK); |
1589 expression = Traits::RewriteExpression(expression); | 1592 expression = Traits::RewriteExpression( |
1593 expression, &computed_name_classifier, CHECK_OK); | |
1590 classifier->Accumulate(computed_name_classifier, | 1594 classifier->Accumulate(computed_name_classifier, |
1591 ExpressionClassifier::ExpressionProductions); | 1595 ExpressionClassifier::ExpressionProductions); |
1592 Expect(Token::RBRACK, CHECK_OK); | 1596 Expect(Token::RBRACK, CHECK_OK); |
1593 return expression; | 1597 return expression; |
1594 } | 1598 } |
1595 | 1599 |
1596 case Token::ESCAPED_KEYWORD: | 1600 case Token::ESCAPED_KEYWORD: |
1597 *is_escaped_keyword = true; | 1601 *is_escaped_keyword = true; |
1598 *name = ParseIdentifierNameOrGetOrSet(is_get, is_set, CHECK_OK); | 1602 *name = ParseIdentifierNameOrGetOrSet(is_get, is_set, CHECK_OK); |
1599 break; | 1603 break; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1693 | 1697 |
1694 ExpressionT lhs = this->ExpressionFromIdentifier( | 1698 ExpressionT lhs = this->ExpressionFromIdentifier( |
1695 *name, next_beg_pos, next_end_pos, scope_, factory()); | 1699 *name, next_beg_pos, next_end_pos, scope_, factory()); |
1696 CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); | 1700 CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); |
1697 | 1701 |
1698 if (peek() == Token::ASSIGN) { | 1702 if (peek() == Token::ASSIGN) { |
1699 Consume(Token::ASSIGN); | 1703 Consume(Token::ASSIGN); |
1700 ExpressionClassifier rhs_classifier; | 1704 ExpressionClassifier rhs_classifier; |
1701 ExpressionT rhs = this->ParseAssignmentExpression( | 1705 ExpressionT rhs = this->ParseAssignmentExpression( |
1702 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 1706 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
1703 rhs = Traits::RewriteExpression(rhs); | 1707 rhs = Traits::RewriteExpression( |
1708 rhs, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | |
1704 classifier->Accumulate(rhs_classifier, | 1709 classifier->Accumulate(rhs_classifier, |
1705 ExpressionClassifier::ExpressionProductions); | 1710 ExpressionClassifier::ExpressionProductions); |
1706 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, | 1711 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
1707 RelocInfo::kNoPosition); | 1712 RelocInfo::kNoPosition); |
1708 classifier->RecordCoverInitializedNameError( | 1713 classifier->RecordCoverInitializedNameError( |
1709 Scanner::Location(next_beg_pos, scanner()->location().end_pos), | 1714 Scanner::Location(next_beg_pos, scanner()->location().end_pos), |
1710 MessageTemplate::kInvalidCoverInitializedName); | 1715 MessageTemplate::kInvalidCoverInitializedName); |
1711 } else { | 1716 } else { |
1712 value = lhs; | 1717 value = lhs; |
1713 } | 1718 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1761 is_static, *is_computed_name); | 1766 is_static, *is_computed_name); |
1762 } | 1767 } |
1763 | 1768 |
1764 if (in_class && name_is_static && !is_static) { | 1769 if (in_class && name_is_static && !is_static) { |
1765 // ClassElement (static) | 1770 // ClassElement (static) |
1766 // 'static' MethodDefinition | 1771 // 'static' MethodDefinition |
1767 *name = this->EmptyIdentifier(); | 1772 *name = this->EmptyIdentifier(); |
1768 ObjectLiteralPropertyT property = ParsePropertyDefinition( | 1773 ObjectLiteralPropertyT property = ParsePropertyDefinition( |
1769 checker, true, has_extends, true, is_computed_name, nullptr, classifier, | 1774 checker, true, has_extends, true, is_computed_name, nullptr, classifier, |
1770 name, ok); | 1775 name, ok); |
1771 property = Traits::RewriteObjectLiteralProperty(property); | 1776 property = Traits::RewriteObjectLiteralProperty(property, classifier, ok); |
1772 return property; | 1777 return property; |
1773 } | 1778 } |
1774 | 1779 |
1775 if (is_get || is_set) { | 1780 if (is_get || is_set) { |
1776 // MethodDefinition (Accessors) | 1781 // MethodDefinition (Accessors) |
1777 // get PropertyName '(' ')' '{' FunctionBody '}' | 1782 // get PropertyName '(' ')' '{' FunctionBody '}' |
1778 // set PropertyName '(' PropertySetParameterList ')' '{' FunctionBody '}' | 1783 // set PropertyName '(' PropertySetParameterList ')' '{' FunctionBody '}' |
1779 *name = this->EmptyIdentifier(); | 1784 *name = this->EmptyIdentifier(); |
1780 bool dont_care = false; | 1785 bool dont_care = false; |
1781 name_token = peek(); | 1786 name_token = peek(); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1901 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList)); | 1906 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList)); |
1902 bool done = (peek() == Token::RPAREN); | 1907 bool done = (peek() == Token::RPAREN); |
1903 bool was_unspread = false; | 1908 bool was_unspread = false; |
1904 int unspread_sequences_count = 0; | 1909 int unspread_sequences_count = 0; |
1905 while (!done) { | 1910 while (!done) { |
1906 int start_pos = peek_position(); | 1911 int start_pos = peek_position(); |
1907 bool is_spread = Check(Token::ELLIPSIS); | 1912 bool is_spread = Check(Token::ELLIPSIS); |
1908 | 1913 |
1909 ExpressionT argument = this->ParseAssignmentExpression( | 1914 ExpressionT argument = this->ParseAssignmentExpression( |
1910 true, classifier, CHECK_OK_CUSTOM(NullExpressionList)); | 1915 true, classifier, CHECK_OK_CUSTOM(NullExpressionList)); |
1911 argument = Traits::RewriteExpression(argument); | 1916 argument = Traits::RewriteExpression(argument, classifier, |
1917 CHECK_OK_CUSTOM(NullExpressionList)); | |
1912 if (is_spread) { | 1918 if (is_spread) { |
1913 if (!spread_arg.IsValid()) { | 1919 if (!spread_arg.IsValid()) { |
1914 spread_arg.beg_pos = start_pos; | 1920 spread_arg.beg_pos = start_pos; |
1915 spread_arg.end_pos = peek_position(); | 1921 spread_arg.end_pos = peek_position(); |
1916 } | 1922 } |
1917 argument = factory()->NewSpread(argument, start_pos); | 1923 argument = factory()->NewSpread(argument, start_pos); |
1918 } | 1924 } |
1919 result->Add(argument, zone_); | 1925 result->Add(argument, zone_); |
1920 | 1926 |
1921 // unspread_sequences_count is the number of sequences of parameters which | 1927 // unspread_sequences_count is the number of sequences of parameters which |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2040 bool maybe_pattern = | 2046 bool maybe_pattern = |
2041 (expression->IsObjectLiteral() || expression->IsArrayLiteral()) && | 2047 (expression->IsObjectLiteral() || expression->IsArrayLiteral()) && |
2042 !expression->is_parenthesized(); | 2048 !expression->is_parenthesized(); |
2043 | 2049 |
2044 if (!Token::IsAssignmentOp(peek())) { | 2050 if (!Token::IsAssignmentOp(peek())) { |
2045 // Parsed conditional expression only (no assignment). | 2051 // Parsed conditional expression only (no assignment). |
2046 if (is_pattern_element) { | 2052 if (is_pattern_element) { |
2047 CheckDestructuringElement(expression, classifier, lhs_beg_pos, | 2053 CheckDestructuringElement(expression, classifier, lhs_beg_pos, |
2048 scanner()->location().end_pos); | 2054 scanner()->location().end_pos); |
2049 } else if (is_rhs && maybe_pattern) { | 2055 } else if (is_rhs && maybe_pattern) { |
2056 #if 0 // TODO(nikolaos): is this needed? | |
rossberg
2016/01/12 13:47:52
Hm, why is it not needed? Don't you even have to d
nickie
2016/01/12 14:12:32
I have a RewriteExpression at the place where the
caitp (gmail)
2016/01/12 14:25:55
It looks like you can remove this block, and the f
nickie
2016/01/12 15:16:09
Acknowledged.
| |
2050 ValidateExpression(classifier, CHECK_OK); | 2057 ValidateExpression(classifier, CHECK_OK); |
2058 #endif | |
2051 } | 2059 } |
2052 | |
2053 return expression; | 2060 return expression; |
2054 } | 2061 } |
2055 | 2062 |
2056 if (!(allow_harmony_destructuring_bind() || | 2063 if (!(allow_harmony_destructuring_bind() || |
2057 allow_harmony_default_parameters())) { | 2064 allow_harmony_default_parameters())) { |
2058 BindingPatternUnexpectedToken(classifier); | 2065 BindingPatternUnexpectedToken(classifier); |
2059 } | 2066 } |
2060 | 2067 |
2061 if (allow_harmony_destructuring_assignment() && maybe_pattern && | 2068 if (allow_harmony_destructuring_assignment() && maybe_pattern && |
2062 peek() == Token::ASSIGN) { | 2069 peek() == Token::ASSIGN) { |
(...skipping 24 matching lines...) Expand all Loading... | |
2087 } | 2094 } |
2088 int pos = position(); | 2095 int pos = position(); |
2089 | 2096 |
2090 ExpressionClassifier rhs_classifier; | 2097 ExpressionClassifier rhs_classifier; |
2091 | 2098 |
2092 int rhs_flags = flags; | 2099 int rhs_flags = flags; |
2093 rhs_flags &= ~(kIsPatternElement | kIsPossibleArrowFormals); | 2100 rhs_flags &= ~(kIsPatternElement | kIsPossibleArrowFormals); |
2094 rhs_flags |= kIsRightHandSide; | 2101 rhs_flags |= kIsRightHandSide; |
2095 ExpressionT right = this->ParseAssignmentExpression( | 2102 ExpressionT right = this->ParseAssignmentExpression( |
2096 accept_IN, rhs_flags, &rhs_classifier, CHECK_OK); | 2103 accept_IN, rhs_flags, &rhs_classifier, CHECK_OK); |
2097 right = Traits::RewriteExpression(right); | 2104 right = Traits::RewriteExpression(right, &rhs_classifier, CHECK_OK); |
2098 classifier->Accumulate( | 2105 classifier->Accumulate( |
2099 rhs_classifier, ExpressionClassifier::ExpressionProductions | | 2106 rhs_classifier, ExpressionClassifier::ExpressionProductions | |
2100 ExpressionClassifier::CoverInitializedNameProduction); | 2107 ExpressionClassifier::CoverInitializedNameProduction); |
2101 | 2108 |
2102 // TODO(1231235): We try to estimate the set of properties set by | 2109 // TODO(1231235): We try to estimate the set of properties set by |
2103 // constructors. We define a new property whenever there is an | 2110 // constructors. We define a new property whenever there is an |
2104 // assignment to a property of 'this'. We should probably only add | 2111 // assignment to a property of 'this'. We should probably only add |
2105 // properties if we haven't seen them before. Otherwise we'll | 2112 // properties if we haven't seen them before. Otherwise we'll |
2106 // probably overestimate the number of properties. | 2113 // probably overestimate the number of properties. |
2107 if (op == Token::ASSIGN && this->IsThisProperty(expression)) { | 2114 if (op == Token::ASSIGN && this->IsThisProperty(expression)) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2159 // The above set of tokens is the complete set of tokens that can appear | 2166 // The above set of tokens is the complete set of tokens that can appear |
2160 // after an AssignmentExpression, and none of them can start an | 2167 // after an AssignmentExpression, and none of them can start an |
2161 // AssignmentExpression. This allows us to avoid looking for an RHS for | 2168 // AssignmentExpression. This allows us to avoid looking for an RHS for |
2162 // a Yield::kSuspend operation, given only one look-ahead token. | 2169 // a Yield::kSuspend operation, given only one look-ahead token. |
2163 if (kind == Yield::kSuspend) | 2170 if (kind == Yield::kSuspend) |
2164 break; | 2171 break; |
2165 DCHECK_EQ(Yield::kDelegating, kind); | 2172 DCHECK_EQ(Yield::kDelegating, kind); |
2166 // Delegating yields require an RHS; fall through. | 2173 // Delegating yields require an RHS; fall through. |
2167 default: | 2174 default: |
2168 expression = ParseAssignmentExpression(false, classifier, CHECK_OK); | 2175 expression = ParseAssignmentExpression(false, classifier, CHECK_OK); |
2169 expression = Traits::RewriteExpression(expression); | 2176 expression = |
2177 Traits::RewriteExpression(expression, classifier, CHECK_OK); | |
2170 break; | 2178 break; |
2171 } | 2179 } |
2172 } | 2180 } |
2173 if (kind == Yield::kDelegating) { | 2181 if (kind == Yield::kDelegating) { |
2174 // var iterator = subject[Symbol.iterator](); | 2182 // var iterator = subject[Symbol.iterator](); |
2175 // Hackily disambiguate o from o.next and o [Symbol.iterator](). | 2183 // Hackily disambiguate o from o.next and o [Symbol.iterator](). |
2176 // TODO(verwaest): Come up with a better solution. | 2184 // TODO(verwaest): Come up with a better solution. |
2177 expression = this->GetIterator(expression, factory(), pos + 1); | 2185 expression = this->GetIterator(expression, factory(), pos + 1); |
2178 } | 2186 } |
2179 // Hackily disambiguate o from o.next and o [Symbol.iterator](). | 2187 // Hackily disambiguate o from o.next and o [Symbol.iterator](). |
(...skipping 12 matching lines...) Expand all Loading... | |
2192 bool* ok) { | 2200 bool* ok) { |
2193 // ConditionalExpression :: | 2201 // ConditionalExpression :: |
2194 // LogicalOrExpression | 2202 // LogicalOrExpression |
2195 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression | 2203 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression |
2196 | 2204 |
2197 int pos = peek_position(); | 2205 int pos = peek_position(); |
2198 // We start using the binary expression parser for prec >= 4 only! | 2206 // We start using the binary expression parser for prec >= 4 only! |
2199 ExpressionT expression = | 2207 ExpressionT expression = |
2200 this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK); | 2208 this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK); |
2201 if (peek() != Token::CONDITIONAL) return expression; | 2209 if (peek() != Token::CONDITIONAL) return expression; |
2202 expression = Traits::RewriteExpression(expression); | 2210 expression = Traits::RewriteExpression(expression, classifier, CHECK_OK); |
2203 ArrowFormalParametersUnexpectedToken(classifier); | 2211 ArrowFormalParametersUnexpectedToken(classifier); |
2204 BindingPatternUnexpectedToken(classifier); | 2212 BindingPatternUnexpectedToken(classifier); |
2205 Consume(Token::CONDITIONAL); | 2213 Consume(Token::CONDITIONAL); |
2206 // In parsing the first assignment expression in conditional | 2214 // In parsing the first assignment expression in conditional |
2207 // expressions we always accept the 'in' keyword; see ECMA-262, | 2215 // expressions we always accept the 'in' keyword; see ECMA-262, |
2208 // section 11.12, page 58. | 2216 // section 11.12, page 58. |
2209 ExpressionT left = ParseAssignmentExpression(true, classifier, CHECK_OK); | 2217 ExpressionT left = ParseAssignmentExpression(true, classifier, CHECK_OK); |
2210 left = Traits::RewriteExpression(left); | 2218 left = Traits::RewriteExpression(left, classifier, CHECK_OK); |
2211 Expect(Token::COLON, CHECK_OK); | 2219 Expect(Token::COLON, CHECK_OK); |
2212 ExpressionT right = | 2220 ExpressionT right = |
2213 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK); | 2221 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK); |
2214 right = Traits::RewriteExpression(right); | 2222 right = Traits::RewriteExpression(right, classifier, CHECK_OK); |
2215 return factory()->NewConditional(expression, left, right, pos); | 2223 return factory()->NewConditional(expression, left, right, pos); |
2216 } | 2224 } |
2217 | 2225 |
2218 | 2226 |
2219 // Precedence >= 4 | 2227 // Precedence >= 4 |
2220 template <class Traits> | 2228 template <class Traits> |
2221 typename ParserBase<Traits>::ExpressionT | 2229 typename ParserBase<Traits>::ExpressionT |
2222 ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, | 2230 ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
2223 ExpressionClassifier* classifier, | 2231 ExpressionClassifier* classifier, |
2224 bool* ok) { | 2232 bool* ok) { |
2225 DCHECK(prec >= 4); | 2233 DCHECK(prec >= 4); |
2226 ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); | 2234 ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); |
2227 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { | 2235 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { |
2228 // prec1 >= 4 | 2236 // prec1 >= 4 |
2229 while (Precedence(peek(), accept_IN) == prec1) { | 2237 while (Precedence(peek(), accept_IN) == prec1) { |
2230 x = Traits::RewriteExpression(x); | 2238 x = Traits::RewriteExpression(x, classifier, CHECK_OK); |
2231 BindingPatternUnexpectedToken(classifier); | 2239 BindingPatternUnexpectedToken(classifier); |
2232 ArrowFormalParametersUnexpectedToken(classifier); | 2240 ArrowFormalParametersUnexpectedToken(classifier); |
2233 Token::Value op = Next(); | 2241 Token::Value op = Next(); |
2234 Scanner::Location op_location = scanner()->location(); | 2242 Scanner::Location op_location = scanner()->location(); |
2235 int pos = position(); | 2243 int pos = position(); |
2236 ExpressionT y = | 2244 ExpressionT y = |
2237 ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK); | 2245 ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK); |
2238 y = Traits::RewriteExpression(y); | 2246 y = Traits::RewriteExpression(y, classifier, CHECK_OK); |
2239 | 2247 |
2240 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, | 2248 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, |
2241 factory())) { | 2249 factory())) { |
2242 continue; | 2250 continue; |
2243 } | 2251 } |
2244 | 2252 |
2245 // For now we distinguish between comparisons and other binary | 2253 // For now we distinguish between comparisons and other binary |
2246 // operations. (We could combine the two and get rid of this | 2254 // operations. (We could combine the two and get rid of this |
2247 // code and AST node eventually.) | 2255 // code and AST node eventually.) |
2248 if (Token::IsCompareOp(op)) { | 2256 if (Token::IsCompareOp(op)) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2291 // '!' UnaryExpression | 2299 // '!' UnaryExpression |
2292 | 2300 |
2293 Token::Value op = peek(); | 2301 Token::Value op = peek(); |
2294 if (Token::IsUnaryOp(op)) { | 2302 if (Token::IsUnaryOp(op)) { |
2295 BindingPatternUnexpectedToken(classifier); | 2303 BindingPatternUnexpectedToken(classifier); |
2296 ArrowFormalParametersUnexpectedToken(classifier); | 2304 ArrowFormalParametersUnexpectedToken(classifier); |
2297 | 2305 |
2298 op = Next(); | 2306 op = Next(); |
2299 int pos = position(); | 2307 int pos = position(); |
2300 ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK); | 2308 ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK); |
2301 expression = Traits::RewriteExpression(expression); | 2309 expression = Traits::RewriteExpression(expression, classifier, CHECK_OK); |
2302 | 2310 |
2303 if (op == Token::DELETE && is_strict(language_mode())) { | 2311 if (op == Token::DELETE && is_strict(language_mode())) { |
2304 if (is_strong(language_mode())) { | 2312 if (is_strong(language_mode())) { |
2305 ReportMessage(MessageTemplate::kStrongDelete); | 2313 ReportMessage(MessageTemplate::kStrongDelete); |
2306 *ok = false; | 2314 *ok = false; |
2307 return this->EmptyExpression(); | 2315 return this->EmptyExpression(); |
2308 } else if (this->IsIdentifier(expression)) { | 2316 } else if (this->IsIdentifier(expression)) { |
2309 // "delete identifier" is a syntax error in strict mode. | 2317 // "delete identifier" is a syntax error in strict mode. |
2310 ReportMessage(MessageTemplate::kStrictDelete); | 2318 ReportMessage(MessageTemplate::kStrictDelete); |
2311 *ok = false; | 2319 *ok = false; |
2312 return this->EmptyExpression(); | 2320 return this->EmptyExpression(); |
2313 } | 2321 } |
2314 } | 2322 } |
2315 | 2323 |
2316 // Allow Traits do rewrite the expression. | 2324 // Allow Traits do rewrite the expression. |
2317 return this->BuildUnaryExpression(expression, op, pos, factory()); | 2325 return this->BuildUnaryExpression(expression, op, pos, factory()); |
2318 } else if (Token::IsCountOp(op)) { | 2326 } else if (Token::IsCountOp(op)) { |
2319 BindingPatternUnexpectedToken(classifier); | 2327 BindingPatternUnexpectedToken(classifier); |
2320 ArrowFormalParametersUnexpectedToken(classifier); | 2328 ArrowFormalParametersUnexpectedToken(classifier); |
2321 op = Next(); | 2329 op = Next(); |
2322 int beg_pos = peek_position(); | 2330 int beg_pos = peek_position(); |
2323 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); | 2331 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); |
2324 expression = this->CheckAndRewriteReferenceExpression( | 2332 expression = this->CheckAndRewriteReferenceExpression( |
2325 expression, beg_pos, scanner()->location().end_pos, | 2333 expression, beg_pos, scanner()->location().end_pos, |
2326 MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK); | 2334 MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK); |
2327 this->MarkExpressionAsAssigned(expression); | 2335 this->MarkExpressionAsAssigned(expression); |
2328 expression = Traits::RewriteExpression(expression); | 2336 expression = Traits::RewriteExpression(expression, classifier, CHECK_OK); |
2329 | 2337 |
2330 return factory()->NewCountOperation(op, | 2338 return factory()->NewCountOperation(op, |
2331 true /* prefix */, | 2339 true /* prefix */, |
2332 expression, | 2340 expression, |
2333 position()); | 2341 position()); |
2334 | 2342 |
2335 } else { | 2343 } else { |
2336 return this->ParsePostfixExpression(classifier, ok); | 2344 return this->ParsePostfixExpression(classifier, ok); |
2337 } | 2345 } |
2338 } | 2346 } |
(...skipping 11 matching lines...) Expand all Loading... | |
2350 this->ParseLeftHandSideExpression(classifier, CHECK_OK); | 2358 this->ParseLeftHandSideExpression(classifier, CHECK_OK); |
2351 if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 2359 if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
2352 Token::IsCountOp(peek())) { | 2360 Token::IsCountOp(peek())) { |
2353 BindingPatternUnexpectedToken(classifier); | 2361 BindingPatternUnexpectedToken(classifier); |
2354 ArrowFormalParametersUnexpectedToken(classifier); | 2362 ArrowFormalParametersUnexpectedToken(classifier); |
2355 | 2363 |
2356 expression = this->CheckAndRewriteReferenceExpression( | 2364 expression = this->CheckAndRewriteReferenceExpression( |
2357 expression, lhs_beg_pos, scanner()->location().end_pos, | 2365 expression, lhs_beg_pos, scanner()->location().end_pos, |
2358 MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK); | 2366 MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK); |
2359 expression = this->MarkExpressionAsAssigned(expression); | 2367 expression = this->MarkExpressionAsAssigned(expression); |
2368 expression = Traits::RewriteExpression(expression, classifier, CHECK_OK); | |
2360 | 2369 |
2361 Token::Value next = Next(); | 2370 Token::Value next = Next(); |
2362 expression = | 2371 expression = |
2363 factory()->NewCountOperation(next, | 2372 factory()->NewCountOperation(next, |
2364 false /* postfix */, | 2373 false /* postfix */, |
2365 expression, | 2374 expression, |
2366 position()); | 2375 position()); |
2367 } | 2376 } |
2368 return expression; | 2377 return expression; |
2369 } | 2378 } |
(...skipping 10 matching lines...) Expand all Loading... | |
2380 this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); | 2389 this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); |
2381 | 2390 |
2382 while (true) { | 2391 while (true) { |
2383 switch (peek()) { | 2392 switch (peek()) { |
2384 case Token::LBRACK: { | 2393 case Token::LBRACK: { |
2385 BindingPatternUnexpectedToken(classifier); | 2394 BindingPatternUnexpectedToken(classifier); |
2386 ArrowFormalParametersUnexpectedToken(classifier); | 2395 ArrowFormalParametersUnexpectedToken(classifier); |
2387 Consume(Token::LBRACK); | 2396 Consume(Token::LBRACK); |
2388 int pos = position(); | 2397 int pos = position(); |
2389 ExpressionT index = ParseExpression(true, classifier, CHECK_OK); | 2398 ExpressionT index = ParseExpression(true, classifier, CHECK_OK); |
2390 index = Traits::RewriteExpression(index); | 2399 index = Traits::RewriteExpression(index, classifier, CHECK_OK); |
2391 result = factory()->NewProperty(result, index, pos); | 2400 result = factory()->NewProperty(result, index, pos); |
2392 Expect(Token::RBRACK, CHECK_OK); | 2401 Expect(Token::RBRACK, CHECK_OK); |
2393 break; | 2402 break; |
2394 } | 2403 } |
2395 | 2404 |
2396 case Token::LPAREN: { | 2405 case Token::LPAREN: { |
2397 result = Traits::RewriteExpression(result); | 2406 result = Traits::RewriteExpression(result, classifier, CHECK_OK); |
2398 BindingPatternUnexpectedToken(classifier); | 2407 BindingPatternUnexpectedToken(classifier); |
2399 ArrowFormalParametersUnexpectedToken(classifier); | 2408 ArrowFormalParametersUnexpectedToken(classifier); |
2400 | 2409 |
2401 if (is_strong(language_mode()) && this->IsIdentifier(result) && | 2410 if (is_strong(language_mode()) && this->IsIdentifier(result) && |
2402 this->IsEval(this->AsIdentifier(result))) { | 2411 this->IsEval(this->AsIdentifier(result))) { |
2403 ReportMessage(MessageTemplate::kStrongDirectEval); | 2412 ReportMessage(MessageTemplate::kStrongDirectEval); |
2404 *ok = false; | 2413 *ok = false; |
2405 return this->EmptyExpression(); | 2414 return this->EmptyExpression(); |
2406 } | 2415 } |
2407 int pos; | 2416 int pos; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2515 int new_pos = position(); | 2524 int new_pos = position(); |
2516 ExpressionT result = this->EmptyExpression(); | 2525 ExpressionT result = this->EmptyExpression(); |
2517 if (peek() == Token::SUPER) { | 2526 if (peek() == Token::SUPER) { |
2518 const bool is_new = true; | 2527 const bool is_new = true; |
2519 result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 2528 result = ParseSuperExpression(is_new, classifier, CHECK_OK); |
2520 } else if (peek() == Token::PERIOD) { | 2529 } else if (peek() == Token::PERIOD) { |
2521 return ParseNewTargetExpression(CHECK_OK); | 2530 return ParseNewTargetExpression(CHECK_OK); |
2522 } else { | 2531 } else { |
2523 result = this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); | 2532 result = this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); |
2524 } | 2533 } |
2525 result = Traits::RewriteExpression(result); | 2534 result = Traits::RewriteExpression(result, classifier, CHECK_OK); |
2526 if (peek() == Token::LPAREN) { | 2535 if (peek() == Token::LPAREN) { |
2527 // NewExpression with arguments. | 2536 // NewExpression with arguments. |
2528 Scanner::Location spread_pos; | 2537 Scanner::Location spread_pos; |
2529 typename Traits::Type::ExpressionList args = | 2538 typename Traits::Type::ExpressionList args = |
2530 this->ParseArguments(&spread_pos, classifier, CHECK_OK); | 2539 this->ParseArguments(&spread_pos, classifier, CHECK_OK); |
2531 | 2540 |
2532 if (spread_pos.IsValid()) { | 2541 if (spread_pos.IsValid()) { |
2533 args = Traits::PrepareSpreadArguments(args); | 2542 args = Traits::PrepareSpreadArguments(args); |
2534 result = Traits::SpreadCallNew(result, args, new_pos); | 2543 result = Traits::SpreadCallNew(result, args, new_pos); |
2535 } else { | 2544 } else { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2615 int pos = position(); | 2624 int pos = position(); |
2616 function_state_->set_this_location(scanner()->location()); | 2625 function_state_->set_this_location(scanner()->location()); |
2617 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); | 2626 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); |
2618 | 2627 |
2619 ExpressionT left = this->EmptyExpression(); | 2628 ExpressionT left = this->EmptyExpression(); |
2620 switch (peek()) { | 2629 switch (peek()) { |
2621 case Token::LBRACK: { | 2630 case Token::LBRACK: { |
2622 Consume(Token::LBRACK); | 2631 Consume(Token::LBRACK); |
2623 int pos = position(); | 2632 int pos = position(); |
2624 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); | 2633 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); |
2625 index = Traits::RewriteExpression(index); | 2634 index = Traits::RewriteExpression(index, classifier, CHECK_OK); |
2626 left = factory()->NewProperty(this_expr, index, pos); | 2635 left = factory()->NewProperty(this_expr, index, pos); |
2627 if (fni_ != NULL) { | 2636 if (fni_ != NULL) { |
2628 this->PushPropertyName(fni_, index); | 2637 this->PushPropertyName(fni_, index); |
2629 } | 2638 } |
2630 Expect(Token::RBRACK, CHECK_OK); | 2639 Expect(Token::RBRACK, CHECK_OK); |
2631 break; | 2640 break; |
2632 } | 2641 } |
2633 case Token::PERIOD: { | 2642 case Token::PERIOD: { |
2634 Consume(Token::PERIOD); | 2643 Consume(Token::PERIOD); |
2635 int pos = position(); | 2644 int pos = position(); |
(...skipping 15 matching lines...) Expand all Loading... | |
2651 ReportMessageAt(function_state_->this_location(), | 2660 ReportMessageAt(function_state_->this_location(), |
2652 MessageTemplate::kStrongConstructorThis); | 2661 MessageTemplate::kStrongConstructorThis); |
2653 *ok = false; | 2662 *ok = false; |
2654 return this->EmptyExpression(); | 2663 return this->EmptyExpression(); |
2655 } | 2664 } |
2656 Consume(Token::ASSIGN); | 2665 Consume(Token::ASSIGN); |
2657 left = this->MarkExpressionAsAssigned(left); | 2666 left = this->MarkExpressionAsAssigned(left); |
2658 | 2667 |
2659 ExpressionT right = | 2668 ExpressionT right = |
2660 this->ParseAssignmentExpression(true, classifier, CHECK_OK); | 2669 this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
2661 right = Traits::RewriteExpression(right); | 2670 right = Traits::RewriteExpression(right, classifier, CHECK_OK); |
2662 this->CheckAssigningFunctionLiteralToProperty(left, right); | 2671 this->CheckAssigningFunctionLiteralToProperty(left, right); |
2663 function_state_->AddProperty(); | 2672 function_state_->AddProperty(); |
2664 if (fni_ != NULL) { | 2673 if (fni_ != NULL) { |
2665 // Check if the right hand side is a call to avoid inferring a | 2674 // Check if the right hand side is a call to avoid inferring a |
2666 // name if we're dealing with "this.a = function(){...}();"-like | 2675 // name if we're dealing with "this.a = function(){...}();"-like |
2667 // expression. | 2676 // expression. |
2668 if (!right->IsCall() && !right->IsCallNew()) { | 2677 if (!right->IsCall() && !right->IsCallNew()) { |
2669 fni_->Infer(); | 2678 fni_->Infer(); |
2670 } else { | 2679 } else { |
2671 fni_->RemoveLastFunction(); | 2680 fni_->RemoveLastFunction(); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2808 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* | 2817 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* |
2809 while (true) { | 2818 while (true) { |
2810 switch (peek()) { | 2819 switch (peek()) { |
2811 case Token::LBRACK: { | 2820 case Token::LBRACK: { |
2812 BindingPatternUnexpectedToken(classifier); | 2821 BindingPatternUnexpectedToken(classifier); |
2813 ArrowFormalParametersUnexpectedToken(classifier); | 2822 ArrowFormalParametersUnexpectedToken(classifier); |
2814 | 2823 |
2815 Consume(Token::LBRACK); | 2824 Consume(Token::LBRACK); |
2816 int pos = position(); | 2825 int pos = position(); |
2817 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); | 2826 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); |
2818 index = Traits::RewriteExpression(index); | 2827 index = Traits::RewriteExpression(index, classifier, CHECK_OK); |
2819 expression = factory()->NewProperty(expression, index, pos); | 2828 expression = factory()->NewProperty(expression, index, pos); |
2820 if (fni_ != NULL) { | 2829 if (fni_ != NULL) { |
2821 this->PushPropertyName(fni_, index); | 2830 this->PushPropertyName(fni_, index); |
2822 } | 2831 } |
2823 Expect(Token::RBRACK, CHECK_OK); | 2832 Expect(Token::RBRACK, CHECK_OK); |
2824 break; | 2833 break; |
2825 } | 2834 } |
2826 case Token::PERIOD: { | 2835 case Token::PERIOD: { |
2827 BindingPatternUnexpectedToken(classifier); | 2836 BindingPatternUnexpectedToken(classifier); |
2828 ArrowFormalParametersUnexpectedToken(classifier); | 2837 ArrowFormalParametersUnexpectedToken(classifier); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2889 ValidateFormalParameterInitializer(classifier, ok); | 2898 ValidateFormalParameterInitializer(classifier, ok); |
2890 if (!*ok) return; | 2899 if (!*ok) return; |
2891 classifier->RecordNonSimpleParameter(); | 2900 classifier->RecordNonSimpleParameter(); |
2892 } | 2901 } |
2893 | 2902 |
2894 ExpressionT initializer = Traits::EmptyExpression(); | 2903 ExpressionT initializer = Traits::EmptyExpression(); |
2895 if (!is_rest && allow_harmony_default_parameters() && Check(Token::ASSIGN)) { | 2904 if (!is_rest && allow_harmony_default_parameters() && Check(Token::ASSIGN)) { |
2896 ExpressionClassifier init_classifier; | 2905 ExpressionClassifier init_classifier; |
2897 initializer = ParseAssignmentExpression(true, &init_classifier, ok); | 2906 initializer = ParseAssignmentExpression(true, &init_classifier, ok); |
2898 if (!*ok) return; | 2907 if (!*ok) return; |
2899 ValidateExpression(&init_classifier, ok); | 2908 initializer = Traits::RewriteExpression(initializer, &init_classifier, ok); |
2900 ValidateFormalParameterInitializer(&init_classifier, ok); | 2909 ValidateFormalParameterInitializer(&init_classifier, ok); |
2901 if (!*ok) return; | 2910 if (!*ok) return; |
2902 initializer = Traits::RewriteExpression(initializer); | |
2903 parameters->is_simple = false; | 2911 parameters->is_simple = false; |
2904 classifier->RecordNonSimpleParameter(); | 2912 classifier->RecordNonSimpleParameter(); |
2905 } | 2913 } |
2906 | 2914 |
2907 Traits::AddFormalParameter(parameters, pattern, initializer, | 2915 Traits::AddFormalParameter(parameters, pattern, initializer, |
2908 scanner()->location().end_pos, is_rest); | 2916 scanner()->location().end_pos, is_rest); |
2909 } | 2917 } |
2910 | 2918 |
2911 | 2919 |
2912 template <class Traits> | 2920 template <class Traits> |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3064 function_state.materialized_literal_count(); | 3072 function_state.materialized_literal_count(); |
3065 expected_property_count = function_state.expected_property_count(); | 3073 expected_property_count = function_state.expected_property_count(); |
3066 } | 3074 } |
3067 } else { | 3075 } else { |
3068 // Single-expression body | 3076 // Single-expression body |
3069 int pos = position(); | 3077 int pos = position(); |
3070 parenthesized_function_ = false; | 3078 parenthesized_function_ = false; |
3071 ExpressionClassifier classifier; | 3079 ExpressionClassifier classifier; |
3072 ExpressionT expression = | 3080 ExpressionT expression = |
3073 ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK); | 3081 ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK); |
3074 ValidateExpression(&classifier, CHECK_OK); | 3082 expression = Traits::RewriteExpression(expression, &classifier, CHECK_OK); |
3075 expression = Traits::RewriteExpression(expression); | |
3076 body = this->NewStatementList(1, zone()); | 3083 body = this->NewStatementList(1, zone()); |
3077 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK); | 3084 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK); |
3078 body->Add(factory()->NewReturnStatement(expression, pos), zone()); | 3085 body->Add(factory()->NewReturnStatement(expression, pos), zone()); |
3079 materialized_literal_count = function_state.materialized_literal_count(); | 3086 materialized_literal_count = function_state.materialized_literal_count(); |
3080 expected_property_count = function_state.expected_property_count(); | 3087 expected_property_count = function_state.expected_property_count(); |
3081 } | 3088 } |
3082 super_loc = function_state.super_location(); | 3089 super_loc = function_state.super_location(); |
3083 | 3090 |
3084 formal_parameters.scope->set_end_position(scanner()->location().end_pos); | 3091 formal_parameters.scope->set_end_position(scanner()->location().end_pos); |
3085 | 3092 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3171 } else if (next == Token::ILLEGAL) { | 3178 } else if (next == Token::ILLEGAL) { |
3172 Traits::ReportMessageAt( | 3179 Traits::ReportMessageAt( |
3173 Scanner::Location(position() + 1, peek_position()), | 3180 Scanner::Location(position() + 1, peek_position()), |
3174 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 3181 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); |
3175 *ok = false; | 3182 *ok = false; |
3176 return Traits::EmptyExpression(); | 3183 return Traits::EmptyExpression(); |
3177 } | 3184 } |
3178 | 3185 |
3179 int expr_pos = peek_position(); | 3186 int expr_pos = peek_position(); |
3180 ExpressionT expression = this->ParseExpression(true, classifier, CHECK_OK); | 3187 ExpressionT expression = this->ParseExpression(true, classifier, CHECK_OK); |
3181 expression = Traits::RewriteExpression(expression); | 3188 expression = Traits::RewriteExpression(expression, classifier, CHECK_OK); |
3182 Traits::AddTemplateExpression(&ts, expression); | 3189 Traits::AddTemplateExpression(&ts, expression); |
3183 | 3190 |
3184 if (peek() != Token::RBRACE) { | 3191 if (peek() != Token::RBRACE) { |
3185 ReportMessageAt(Scanner::Location(expr_pos, peek_position()), | 3192 ReportMessageAt(Scanner::Location(expr_pos, peek_position()), |
3186 MessageTemplate::kUnterminatedTemplateExpr); | 3193 MessageTemplate::kUnterminatedTemplateExpr); |
3187 *ok = false; | 3194 *ok = false; |
3188 return Traits::EmptyExpression(); | 3195 return Traits::EmptyExpression(); |
3189 } | 3196 } |
3190 | 3197 |
3191 // If we didn't die parsing that expression, our next token should be a | 3198 // If we didn't die parsing that expression, our next token should be a |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3354 return; | 3361 return; |
3355 } | 3362 } |
3356 has_seen_constructor_ = true; | 3363 has_seen_constructor_ = true; |
3357 return; | 3364 return; |
3358 } | 3365 } |
3359 } | 3366 } |
3360 } // namespace internal | 3367 } // namespace internal |
3361 } // namespace v8 | 3368 } // namespace v8 |
3362 | 3369 |
3363 #endif // V8_PARSING_PARSER_BASE_H | 3370 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |