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 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
| (...skipping 4518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4529 extends = ParseLeftHandSideExpression(CHECK_OK); | 4529 extends = ParseLeftHandSideExpression(CHECK_OK); |
| 4530 CheckNoTailCallExpressions(CHECK_OK); | 4530 CheckNoTailCallExpressions(CHECK_OK); |
| 4531 RewriteNonPattern(CHECK_OK); | 4531 RewriteNonPattern(CHECK_OK); |
| 4532 impl()->AccumulateFormalParameterContainmentErrors(); | 4532 impl()->AccumulateFormalParameterContainmentErrors(); |
| 4533 } else { | 4533 } else { |
| 4534 block_state.set_start_position(scanner()->location().end_pos); | 4534 block_state.set_start_position(scanner()->location().end_pos); |
| 4535 } | 4535 } |
| 4536 | 4536 |
| 4537 | 4537 |
| 4538 ClassLiteralChecker checker(this); | 4538 ClassLiteralChecker checker(this); |
| 4539 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4); | 4539 ZoneList<ClassLiteral::Property*>* properties = NewClassPropertyList(4); |
| 4540 FunctionLiteral* constructor = nullptr; | 4540 FunctionLiteral* constructor = nullptr; |
| 4541 bool has_seen_constructor = false; | 4541 bool has_seen_constructor = false; |
| 4542 | 4542 |
| 4543 Expect(Token::LBRACE, CHECK_OK); | 4543 Expect(Token::LBRACE, CHECK_OK); |
| 4544 | 4544 |
| 4545 const bool has_extends = extends != nullptr; | 4545 const bool has_extends = extends != nullptr; |
| 4546 while (peek() != Token::RBRACE) { | 4546 while (peek() != Token::RBRACE) { |
| 4547 if (Check(Token::SEMICOLON)) continue; | 4547 if (Check(Token::SEMICOLON)) continue; |
| 4548 FuncNameInferrer::State fni_state(fni_); | 4548 FuncNameInferrer::State fni_state(fni_); |
| 4549 const bool in_class = true; | |
| 4550 bool is_computed_name = false; // Classes do not care about computed | 4549 bool is_computed_name = false; // Classes do not care about computed |
| 4551 // property names here. | 4550 // property names here. |
| 4552 ExpressionClassifier property_classifier(this); | 4551 ExpressionClassifier property_classifier(this); |
| 4553 const AstRawString* property_name = nullptr; | 4552 const AstRawString* property_name = nullptr; |
| 4554 ObjectLiteral::Property* property = ParsePropertyDefinition( | 4553 ClassLiteral::Property* property = ParseClassPropertyDefinition( |
| 4555 &checker, in_class, has_extends, &is_computed_name, | 4554 &checker, has_extends, &is_computed_name, &has_seen_constructor, |
| 4556 &has_seen_constructor, &property_name, CHECK_OK); | 4555 &property_name, CHECK_OK); |
| 4557 RewriteNonPattern(CHECK_OK); | 4556 RewriteNonPattern(CHECK_OK); |
| 4558 impl()->AccumulateFormalParameterContainmentErrors(); | 4557 impl()->AccumulateFormalParameterContainmentErrors(); |
| 4559 | 4558 |
| 4560 if (has_seen_constructor && constructor == nullptr) { | 4559 if (has_seen_constructor && constructor == nullptr) { |
| 4561 constructor = GetPropertyValue(property)->AsFunctionLiteral(); | 4560 constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
| 4562 DCHECK_NOT_NULL(constructor); | 4561 DCHECK_NOT_NULL(constructor); |
| 4563 constructor->set_raw_name( | 4562 constructor->set_raw_name( |
| 4564 name != nullptr ? name : ast_value_factory()->empty_string()); | 4563 name != nullptr ? name : ast_value_factory()->empty_string()); |
| 4565 } else { | 4564 } else { |
| 4566 properties->Add(property, zone()); | 4565 properties->Add(property, zone()); |
| (...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5321 return true; | 5320 return true; |
| 5322 } | 5321 } |
| 5323 if (expr->IsBinaryOperation() && | 5322 if (expr->IsBinaryOperation() && |
| 5324 expr->AsBinaryOperation()->op() == Token::COMMA) { | 5323 expr->AsBinaryOperation()->op() == Token::COMMA) { |
| 5325 return true; | 5324 return true; |
| 5326 } | 5325 } |
| 5327 // Everything else does not need rewriting. | 5326 // Everything else does not need rewriting. |
| 5328 return false; | 5327 return false; |
| 5329 } | 5328 } |
| 5330 | 5329 |
| 5331 void VisitObjectLiteralProperty(ObjectLiteralProperty* property) override { | 5330 void VisitLiteralProperty(LiteralProperty* property) override { |
| 5332 if (property == nullptr) return; | 5331 if (property == nullptr) return; |
| 5333 // Do not rewrite (computed) key expressions | 5332 // Do not rewrite (computed) key expressions |
| 5334 AST_REWRITE_PROPERTY(Expression, property, value); | 5333 AST_REWRITE_PROPERTY(Expression, property, value); |
| 5335 } | 5334 } |
| 5336 | 5335 |
| 5337 Parser* parser_; | 5336 Parser* parser_; |
| 5338 }; | 5337 }; |
| 5339 | 5338 |
| 5340 void Parser::RewriteNonPattern(bool* ok) { | 5339 void Parser::RewriteNonPattern(bool* ok) { |
| 5341 ValidateExpression(CHECK_OK_VOID); | 5340 ValidateExpression(CHECK_OK_VOID); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5532 | 5531 |
| 5533 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] | 5532 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] |
| 5534 // of an object literal. | 5533 // of an object literal. |
| 5535 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; | 5534 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; |
| 5536 | 5535 |
| 5537 DCHECK(!value->IsAnonymousFunctionDefinition() || | 5536 DCHECK(!value->IsAnonymousFunctionDefinition() || |
| 5538 property->kind() == ObjectLiteralProperty::COMPUTED); | 5537 property->kind() == ObjectLiteralProperty::COMPUTED); |
| 5539 SetFunctionName(value, name); | 5538 SetFunctionName(value, name); |
| 5540 } | 5539 } |
| 5541 | 5540 |
| 5541 void Parser::SetFunctionNameFromPropertyName(ClassLiteralProperty* property, | |
|
adamk
2016/09/01 21:18:23
Duplicating this is kind of sad...I wonder why we
bakkot
2016/09/01 23:24:31
I'm going to leave this as-is for the moment. I'm
| |
| 5542 const AstRawString* name) { | |
| 5543 Expression* value = property->value(); | |
| 5544 | |
| 5545 // Computed name setting must happen at runtime. | |
| 5546 if (property->is_computed_name()) return; | |
| 5547 | |
| 5548 // Getter and setter names are handled here because their names | |
| 5549 // change in ES2015, even though they are not anonymous. | |
| 5550 auto function = value->AsFunctionLiteral(); | |
| 5551 DCHECK_NOT_NULL(function); | |
| 5552 | |
| 5553 bool is_getter = property->kind() == ClassLiteralProperty::GETTER; | |
| 5554 bool is_setter = property->kind() == ClassLiteralProperty::SETTER; | |
| 5555 if (is_getter || is_setter) { | |
| 5556 DCHECK_NOT_NULL(name); | |
| 5557 const AstRawString* prefix = is_getter | |
| 5558 ? ast_value_factory()->get_space_string() | |
| 5559 : ast_value_factory()->set_space_string(); | |
| 5560 function->set_raw_name(ast_value_factory()->NewConsString(prefix, name)); | |
| 5561 return; | |
| 5562 } | |
| 5563 | |
| 5564 SetFunctionName(value, name); | |
| 5565 } | |
| 5566 | |
| 5542 void Parser::SetFunctionNameFromIdentifierRef(Expression* value, | 5567 void Parser::SetFunctionNameFromIdentifierRef(Expression* value, |
| 5543 Expression* identifier) { | 5568 Expression* identifier) { |
| 5544 if (!identifier->IsVariableProxy()) return; | 5569 if (!identifier->IsVariableProxy()) return; |
| 5545 SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); | 5570 SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); |
| 5546 } | 5571 } |
| 5547 | 5572 |
| 5548 void Parser::SetFunctionName(Expression* value, const AstRawString* name) { | 5573 void Parser::SetFunctionName(Expression* value, const AstRawString* name) { |
| 5549 DCHECK_NOT_NULL(name); | 5574 DCHECK_NOT_NULL(name); |
| 5550 if (!value->IsAnonymousFunctionDefinition()) return; | 5575 if (!value->IsAnonymousFunctionDefinition()) return; |
| 5551 auto function = value->AsFunctionLiteral(); | 5576 auto function = value->AsFunctionLiteral(); |
| (...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6488 node->Print(Isolate::Current()); | 6513 node->Print(Isolate::Current()); |
| 6489 } | 6514 } |
| 6490 #endif // DEBUG | 6515 #endif // DEBUG |
| 6491 | 6516 |
| 6492 #undef CHECK_OK | 6517 #undef CHECK_OK |
| 6493 #undef CHECK_OK_VOID | 6518 #undef CHECK_OK_VOID |
| 6494 #undef CHECK_FAILED | 6519 #undef CHECK_FAILED |
| 6495 | 6520 |
| 6496 } // namespace internal | 6521 } // namespace internal |
| 6497 } // namespace v8 | 6522 } // namespace v8 |
| OLD | NEW |