Chromium Code Reviews| 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_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
| 6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 1467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1478 Scope* scope, PreParserStatementList body, int materialized_literal_count, | 1478 Scope* scope, PreParserStatementList body, int materialized_literal_count, |
| 1479 int expected_property_count, int handler_count, int parameter_count, | 1479 int expected_property_count, int handler_count, int parameter_count, |
| 1480 FunctionLiteral::ParameterFlag has_duplicate_parameters, | 1480 FunctionLiteral::ParameterFlag has_duplicate_parameters, |
| 1481 FunctionLiteral::FunctionType function_type, | 1481 FunctionLiteral::FunctionType function_type, |
| 1482 FunctionLiteral::IsFunctionFlag is_function, | 1482 FunctionLiteral::IsFunctionFlag is_function, |
| 1483 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind, | 1483 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind, |
| 1484 int position) { | 1484 int position) { |
| 1485 return PreParserExpression::Default(); | 1485 return PreParserExpression::Default(); |
| 1486 } | 1486 } |
| 1487 | 1487 |
| 1488 PreParserExpression NewSpread(PreParserExpression expression, int pos) { | 1488 PreParserExpression NewSpread(PreParserExpression expression, |
| 1489 int literal_index, int pos) { | |
| 1489 return PreParserExpression::Spread(expression); | 1490 return PreParserExpression::Spread(expression); |
| 1490 } | 1491 } |
| 1491 | 1492 |
| 1492 // Return the object itself as AstVisitor and implement the needed | 1493 // Return the object itself as AstVisitor and implement the needed |
| 1493 // dummy method right in this class. | 1494 // dummy method right in this class. |
| 1494 PreParserFactory* visitor() { return this; } | 1495 PreParserFactory* visitor() { return this; } |
| 1495 int* ast_properties() { | 1496 int* ast_properties() { |
| 1496 static int dummy = 42; | 1497 static int dummy = 42; |
| 1497 return &dummy; | 1498 return &dummy; |
| 1498 } | 1499 } |
| (...skipping 991 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2490 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( | 2491 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| 2491 ExpressionClassifier* classifier, bool* ok) { | 2492 ExpressionClassifier* classifier, bool* ok) { |
| 2492 // ArrayLiteral :: | 2493 // ArrayLiteral :: |
| 2493 // '[' Expression? (',' Expression?)* ']' | 2494 // '[' Expression? (',' Expression?)* ']' |
| 2494 | 2495 |
| 2495 int pos = peek_position(); | 2496 int pos = peek_position(); |
| 2496 typename Traits::Type::ExpressionList values = | 2497 typename Traits::Type::ExpressionList values = |
| 2497 this->NewExpressionList(4, zone_); | 2498 this->NewExpressionList(4, zone_); |
| 2498 Expect(Token::LBRACK, CHECK_OK); | 2499 Expect(Token::LBRACK, CHECK_OK); |
| 2499 while (peek() != Token::RBRACK) { | 2500 while (peek() != Token::RBRACK) { |
| 2501 bool seen_spread = false; | |
| 2500 ExpressionT elem = this->EmptyExpression(); | 2502 ExpressionT elem = this->EmptyExpression(); |
| 2501 if (peek() == Token::COMMA) { | 2503 if (peek() == Token::COMMA) { |
| 2502 if (is_strong(language_mode())) { | 2504 if (is_strong(language_mode())) { |
| 2503 ReportMessageAt(scanner()->peek_location(), | 2505 ReportMessageAt(scanner()->peek_location(), |
| 2504 MessageTemplate::kStrongEllision); | 2506 MessageTemplate::kStrongEllision); |
| 2505 *ok = false; | 2507 *ok = false; |
| 2506 return this->EmptyExpression(); | 2508 return this->EmptyExpression(); |
| 2507 } | 2509 } |
| 2508 elem = this->GetLiteralTheHole(peek_position(), factory()); | 2510 elem = this->GetLiteralTheHole(peek_position(), factory()); |
| 2511 } else if (peek() == Token::ELLIPSIS) { | |
| 2512 ExpressionUnexpectedToken(classifier); | |
| 2513 int start_pos = peek_position(); | |
| 2514 Consume(Token::ELLIPSIS); | |
| 2515 ExpressionT argument = | |
| 2516 this->ParseAssignmentExpression(true, classifier, CHECK_OK); | |
| 2517 | |
| 2518 int literal_index = function_state_->NextMaterializedLiteralIndex(); | |
|
arv (Not doing code reviews)
2015/05/20 13:52:25
Is this going to be a problem in the case of array
Dmitry Lomov (no reviews)
2015/05/20 14:07:19
I don't think so - we will just have an unused lit
Dmitry Lomov (no reviews)
2015/05/20 14:22:03
Scratch that - I have One Weird Trick in mind here
| |
| 2519 elem = factory()->NewSpread(argument, literal_index, start_pos); | |
| 2520 seen_spread = true; | |
| 2509 } else { | 2521 } else { |
| 2510 elem = this->ParseAssignmentExpression(true, classifier, CHECK_OK); | 2522 elem = this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
| 2511 } | 2523 } |
| 2512 values->Add(elem, zone_); | 2524 values->Add(elem, zone_); |
| 2513 if (peek() != Token::RBRACK) { | 2525 if (peek() != Token::RBRACK) { |
| 2526 if (seen_spread) { | |
| 2527 BindingPatternUnexpectedToken(classifier); | |
| 2528 } | |
| 2514 Expect(Token::COMMA, CHECK_OK); | 2529 Expect(Token::COMMA, CHECK_OK); |
| 2515 } | 2530 } |
| 2516 } | 2531 } |
| 2517 Expect(Token::RBRACK, CHECK_OK); | 2532 Expect(Token::RBRACK, CHECK_OK); |
| 2518 | 2533 |
| 2519 // Update the scope information before the pre-parsing bailout. | 2534 // Update the scope information before the pre-parsing bailout. |
| 2520 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 2535 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
| 2521 | 2536 |
| 2522 return factory()->NewArrayLiteral(values, literal_index, | 2537 return factory()->NewArrayLiteral(values, literal_index, |
| 2523 is_strong(language_mode()), pos); | 2538 is_strong(language_mode()), pos); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2815 int start_pos = peek_position(); | 2830 int start_pos = peek_position(); |
| 2816 if (is_spread) Consume(Token::ELLIPSIS); | 2831 if (is_spread) Consume(Token::ELLIPSIS); |
| 2817 | 2832 |
| 2818 ExpressionT argument = this->ParseAssignmentExpression( | 2833 ExpressionT argument = this->ParseAssignmentExpression( |
| 2819 true, classifier, CHECK_OK_CUSTOM(NullExpressionList)); | 2834 true, classifier, CHECK_OK_CUSTOM(NullExpressionList)); |
| 2820 if (is_spread) { | 2835 if (is_spread) { |
| 2821 if (!spread_arg.IsValid()) { | 2836 if (!spread_arg.IsValid()) { |
| 2822 spread_arg.beg_pos = start_pos; | 2837 spread_arg.beg_pos = start_pos; |
| 2823 spread_arg.end_pos = peek_position(); | 2838 spread_arg.end_pos = peek_position(); |
| 2824 } | 2839 } |
| 2825 argument = factory()->NewSpread(argument, start_pos); | 2840 argument = factory()->NewSpread(argument, -1, start_pos); |
| 2826 } | 2841 } |
| 2827 result->Add(argument, zone_); | 2842 result->Add(argument, zone_); |
| 2828 | 2843 |
| 2829 // unspread_sequences_count is the number of sequences of parameters which | 2844 // unspread_sequences_count is the number of sequences of parameters which |
| 2830 // are not prefixed with a spread '...' operator. | 2845 // are not prefixed with a spread '...' operator. |
| 2831 if (is_spread) { | 2846 if (is_spread) { |
| 2832 was_unspread = false; | 2847 was_unspread = false; |
| 2833 } else if (!was_unspread) { | 2848 } else if (!was_unspread) { |
| 2834 was_unspread = true; | 2849 was_unspread = true; |
| 2835 unspread_sequences_count++; | 2850 unspread_sequences_count++; |
| (...skipping 1171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4007 *ok = false; | 4022 *ok = false; |
| 4008 return; | 4023 return; |
| 4009 } | 4024 } |
| 4010 has_seen_constructor_ = true; | 4025 has_seen_constructor_ = true; |
| 4011 return; | 4026 return; |
| 4012 } | 4027 } |
| 4013 } | 4028 } |
| 4014 } } // v8::internal | 4029 } } // v8::internal |
| 4015 | 4030 |
| 4016 #endif // V8_PREPARSER_H | 4031 #endif // V8_PREPARSER_H |
| OLD | NEW |