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_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 2510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2521 template <typename Impl> | 2521 template <typename Impl> |
| 2522 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( | 2522 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( |
| 2523 bool* ok) { | 2523 bool* ok) { |
| 2524 // ObjectLiteral :: | 2524 // ObjectLiteral :: |
| 2525 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' | 2525 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' |
| 2526 | 2526 |
| 2527 int pos = peek_position(); | 2527 int pos = peek_position(); |
| 2528 typename Types::ObjectPropertyList properties = | 2528 typename Types::ObjectPropertyList properties = |
| 2529 impl()->NewObjectPropertyList(4); | 2529 impl()->NewObjectPropertyList(4); |
| 2530 int number_of_boilerplate_properties = 0; | 2530 int number_of_boilerplate_properties = 0; |
| 2531 int number_of_total_properties = 0; | |
| 2532 | |
| 2531 bool has_computed_names = false; | 2533 bool has_computed_names = false; |
| 2532 ObjectLiteralChecker checker(this); | 2534 ObjectLiteralChecker checker(this); |
| 2533 | 2535 |
| 2534 Expect(Token::LBRACE, CHECK_OK); | 2536 Expect(Token::LBRACE, CHECK_OK); |
| 2535 | 2537 |
| 2536 while (peek() != Token::RBRACE) { | 2538 while (peek() != Token::RBRACE) { |
| 2537 FuncNameInferrer::State fni_state(fni_); | 2539 FuncNameInferrer::State fni_state(fni_); |
| 2538 | 2540 |
| 2539 bool is_computed_name = false; | 2541 bool is_computed_name = false; |
| 2540 ObjectLiteralPropertyT property = | 2542 ObjectLiteralPropertyT property = |
| 2541 ParseObjectPropertyDefinition(&checker, &is_computed_name, CHECK_OK); | 2543 ParseObjectPropertyDefinition(&checker, &is_computed_name, CHECK_OK); |
| 2542 | 2544 |
| 2543 if (is_computed_name) { | 2545 if (is_computed_name) { |
| 2544 has_computed_names = true; | 2546 has_computed_names = true; |
| 2545 } | 2547 } |
| 2546 | 2548 |
| 2547 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. | 2549 if (impl()->IsBoilerplateProperty(property)) { |
| 2548 if (!has_computed_names && impl()->IsBoilerplateProperty(property)) { | 2550 number_of_total_properties++; |
|
Toon Verwaest
2017/01/18 08:49:53
So this isn't needed given we do properties->Add a
Franzi
2017/01/18 14:23:10
Deleted.
| |
| 2549 number_of_boilerplate_properties++; | 2551 // Count CONSTANT or COMPUTED properties to maintain the enumeration |
| 2552 // order. | |
| 2553 if (!has_computed_names) { | |
| 2554 number_of_boilerplate_properties++; | |
| 2555 } | |
| 2550 } | 2556 } |
| 2551 properties->Add(property, zone()); | 2557 properties->Add(property, zone()); |
| 2552 | 2558 |
| 2553 if (peek() != Token::RBRACE) { | 2559 if (peek() != Token::RBRACE) { |
| 2554 // Need {} because of the CHECK_OK macro. | 2560 // Need {} because of the CHECK_OK macro. |
| 2555 Expect(Token::COMMA, CHECK_OK); | 2561 Expect(Token::COMMA, CHECK_OK); |
| 2556 } | 2562 } |
| 2557 | 2563 |
| 2558 if (fni_ != nullptr) fni_->Infer(); | 2564 if (fni_ != nullptr) fni_->Infer(); |
| 2559 } | 2565 } |
| 2560 Expect(Token::RBRACE, CHECK_OK); | 2566 Expect(Token::RBRACE, CHECK_OK); |
| 2561 | 2567 |
| 2562 // Computation of literal_index must happen before pre parse bailout. | 2568 // Computation of literal_index must happen before pre parse bailout. |
| 2563 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 2569 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
| 2564 | 2570 |
| 2565 return factory()->NewObjectLiteral(properties, | 2571 return factory()->NewObjectLiteral(properties, literal_index, |
| 2566 literal_index, | |
| 2567 number_of_boilerplate_properties, | 2572 number_of_boilerplate_properties, |
| 2568 pos); | 2573 number_of_total_properties, pos); |
| 2569 } | 2574 } |
| 2570 | 2575 |
| 2571 template <typename Impl> | 2576 template <typename Impl> |
| 2572 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( | 2577 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( |
| 2573 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { | 2578 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { |
| 2574 // Arguments :: | 2579 // Arguments :: |
| 2575 // '(' (AssignmentExpression)*[','] ')' | 2580 // '(' (AssignmentExpression)*[','] ')' |
| 2576 | 2581 |
| 2577 Scanner::Location spread_arg = Scanner::Location::invalid(); | 2582 Scanner::Location spread_arg = Scanner::Location::invalid(); |
| 2578 ExpressionListT result = impl()->NewExpressionList(4); | 2583 ExpressionListT result = impl()->NewExpressionList(4); |
| (...skipping 2965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5544 has_seen_constructor_ = true; | 5549 has_seen_constructor_ = true; |
| 5545 return; | 5550 return; |
| 5546 } | 5551 } |
| 5547 } | 5552 } |
| 5548 | 5553 |
| 5549 | 5554 |
| 5550 } // namespace internal | 5555 } // namespace internal |
| 5551 } // namespace v8 | 5556 } // namespace v8 |
| 5552 | 5557 |
| 5553 #endif // V8_PARSING_PARSER_BASE_H | 5558 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |