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/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 2116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2127 *name = impl()->EmptyIdentifier(); | 2127 *name = impl()->EmptyIdentifier(); |
2128 Consume(Token::ELLIPSIS); | 2128 Consume(Token::ELLIPSIS); |
2129 expression = ParseAssignmentExpression(true, CHECK_OK); | 2129 expression = ParseAssignmentExpression(true, CHECK_OK); |
2130 *kind = PropertyKind::kSpreadProperty; | 2130 *kind = PropertyKind::kSpreadProperty; |
2131 | 2131 |
2132 if (expression->IsAssignment()) { | 2132 if (expression->IsAssignment()) { |
2133 classifier()->RecordPatternError( | 2133 classifier()->RecordPatternError( |
2134 scanner()->location(), | 2134 scanner()->location(), |
2135 MessageTemplate::kInvalidDestructuringTarget); | 2135 MessageTemplate::kInvalidDestructuringTarget); |
2136 } else { | 2136 } else { |
2137 // TODO(gsathya): Throw error if number of properties > | |
2138 // Code::kMaxArguments | |
2139 CheckDestructuringElement(expression, pos, | 2137 CheckDestructuringElement(expression, pos, |
2140 scanner()->location().end_pos); | 2138 scanner()->location().end_pos); |
2141 } | 2139 } |
2142 | 2140 |
2143 if (peek() != Token::RBRACE) { | 2141 if (peek() != Token::RBRACE) { |
2144 classifier()->RecordPatternError(scanner()->location(), | 2142 classifier()->RecordPatternError(scanner()->location(), |
2145 MessageTemplate::kElementAfterRest); | 2143 MessageTemplate::kElementAfterRest); |
2146 } | 2144 } |
2147 return expression; | 2145 return expression; |
2148 } | 2146 } |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2588 Expect(Token::COMMA, CHECK_OK); | 2586 Expect(Token::COMMA, CHECK_OK); |
2589 } | 2587 } |
2590 | 2588 |
2591 if (fni_ != nullptr) fni_->Infer(); | 2589 if (fni_ != nullptr) fni_->Infer(); |
2592 } | 2590 } |
2593 Expect(Token::RBRACE, CHECK_OK); | 2591 Expect(Token::RBRACE, CHECK_OK); |
2594 | 2592 |
2595 // Computation of literal_index must happen before pre parse bailout. | 2593 // Computation of literal_index must happen before pre parse bailout. |
2596 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 2594 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
2597 | 2595 |
| 2596 // In pattern rewriter, we rewrite rest property to call out to a |
| 2597 // runtime function passing all the other properties as arguments to |
| 2598 // this runtime function. Here, we make sure that the number of |
| 2599 // properties is less than number of arguments allowed for a runtime |
| 2600 // call. |
| 2601 if (has_rest_property && properties->length() > Code::kMaxArguments) { |
| 2602 this->classifier()->RecordPatternError(Scanner::Location(pos, position()), |
| 2603 MessageTemplate::kTooManyArguments); |
| 2604 } |
| 2605 |
2598 return factory()->NewObjectLiteral(properties, literal_index, | 2606 return factory()->NewObjectLiteral(properties, literal_index, |
2599 number_of_boilerplate_properties, pos, | 2607 number_of_boilerplate_properties, pos, |
2600 has_rest_property); | 2608 has_rest_property); |
2601 } | 2609 } |
2602 | 2610 |
2603 template <typename Impl> | 2611 template <typename Impl> |
2604 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( | 2612 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( |
2605 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { | 2613 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { |
2606 // Arguments :: | 2614 // Arguments :: |
2607 // '(' (AssignmentExpression)*[','] ')' | 2615 // '(' (AssignmentExpression)*[','] ')' |
(...skipping 3076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5684 return; | 5692 return; |
5685 } | 5693 } |
5686 } | 5694 } |
5687 | 5695 |
5688 #undef CHECK_OK_VOID | 5696 #undef CHECK_OK_VOID |
5689 | 5697 |
5690 } // namespace internal | 5698 } // namespace internal |
5691 } // namespace v8 | 5699 } // namespace v8 |
5692 | 5700 |
5693 #endif // V8_PARSING_PARSER_BASE_H | 5701 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |