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 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1329 Token::String(Token::RPAREN)); | 1329 Token::String(Token::RPAREN)); |
1330 return factory()->NewEmptyParentheses(beg_pos); | 1330 return factory()->NewEmptyParentheses(beg_pos); |
1331 } else if (Check(Token::ELLIPSIS)) { | 1331 } else if (Check(Token::ELLIPSIS)) { |
1332 // (...x)=>x. The continuation that looks for the => is in | 1332 // (...x)=>x. The continuation that looks for the => is in |
1333 // ParseAssignmentExpression. | 1333 // ParseAssignmentExpression. |
1334 int ellipsis_pos = position(); | 1334 int ellipsis_pos = position(); |
1335 classifier->RecordExpressionError(scanner()->location(), | 1335 classifier->RecordExpressionError(scanner()->location(), |
1336 MessageTemplate::kUnexpectedToken, | 1336 MessageTemplate::kUnexpectedToken, |
1337 Token::String(Token::ELLIPSIS)); | 1337 Token::String(Token::ELLIPSIS)); |
1338 classifier->RecordNonSimpleParameter(); | 1338 classifier->RecordNonSimpleParameter(); |
1339 Scanner::Location expr_loc = scanner()->peek_location(); | |
1340 Token::Value tok = peek(); | |
1341 ExpressionT expr = | 1339 ExpressionT expr = |
1342 this->ParseAssignmentExpression(true, classifier, CHECK_OK); | 1340 this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
1343 // Patterns are not allowed as rest parameters. There is no way we can | |
1344 // succeed so go ahead and use the convenient ReportUnexpectedToken | |
1345 // interface. | |
1346 if (!Traits::IsIdentifier(expr)) { | |
1347 ReportUnexpectedTokenAt(expr_loc, tok); | |
1348 *ok = false; | |
1349 return this->EmptyExpression(); | |
1350 } | |
1351 if (peek() == Token::COMMA) { | 1341 if (peek() == Token::COMMA) { |
1352 ReportMessageAt(scanner()->peek_location(), | 1342 ReportMessageAt(scanner()->peek_location(), |
1353 MessageTemplate::kParamAfterRest); | 1343 MessageTemplate::kParamAfterRest); |
1354 *ok = false; | 1344 *ok = false; |
1355 return this->EmptyExpression(); | 1345 return this->EmptyExpression(); |
1356 } | 1346 } |
1357 Expect(Token::RPAREN, CHECK_OK); | 1347 Expect(Token::RPAREN, CHECK_OK); |
1358 return factory()->NewSpread(expr, ellipsis_pos); | 1348 return factory()->NewSpread(expr, ellipsis_pos); |
1359 } | 1349 } |
1360 // Heuristically try to detect immediately called functions before | 1350 // Heuristically try to detect immediately called functions before |
(...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2862 bool is_rest = parameters->has_rest; | 2852 bool is_rest = parameters->has_rest; |
2863 | 2853 |
2864 Token::Value next = peek(); | 2854 Token::Value next = peek(); |
2865 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); | 2855 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); |
2866 if (!*ok) return; | 2856 if (!*ok) return; |
2867 | 2857 |
2868 ValidateBindingPattern(classifier, ok); | 2858 ValidateBindingPattern(classifier, ok); |
2869 if (!*ok) return; | 2859 if (!*ok) return; |
2870 | 2860 |
2871 if (!Traits::IsIdentifier(pattern)) { | 2861 if (!Traits::IsIdentifier(pattern)) { |
2872 if (is_rest || !allow_harmony_destructuring_bind()) { | 2862 if (!allow_harmony_destructuring_bind()) { |
2873 ReportUnexpectedToken(next); | 2863 ReportUnexpectedToken(next); |
2874 *ok = false; | 2864 *ok = false; |
2875 return; | 2865 return; |
2876 } | 2866 } |
2877 parameters->is_simple = false; | 2867 parameters->is_simple = false; |
2878 ValidateFormalParameterInitializer(classifier, ok); | 2868 ValidateFormalParameterInitializer(classifier, ok); |
2879 if (!*ok) return; | 2869 if (!*ok) return; |
2880 classifier->RecordNonSimpleParameter(); | 2870 classifier->RecordNonSimpleParameter(); |
2881 } | 2871 } |
2882 | 2872 |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3341 return; | 3331 return; |
3342 } | 3332 } |
3343 has_seen_constructor_ = true; | 3333 has_seen_constructor_ = true; |
3344 return; | 3334 return; |
3345 } | 3335 } |
3346 } | 3336 } |
3347 } // namespace internal | 3337 } // namespace internal |
3348 } // namespace v8 | 3338 } // namespace v8 |
3349 | 3339 |
3350 #endif // V8_PARSING_PARSER_BASE_H | 3340 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |