Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index 1b5b7e6779be608e70c4fdc487871cc94bce30fd..6f2955aa8a1fb51bd6d4b85aa9cef3b48dfadb0b 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -179,15 +179,14 @@ void Parser::SetCachedData(ParseInfo* info) { |
} |
} |
- |
-FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope, |
+FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name, |
+ bool call_super, Scope* scope, |
int pos, int end_pos, |
LanguageMode language_mode) { |
int materialized_literal_count = -1; |
int expected_property_count = -1; |
int parameter_count = 0; |
- const AstRawString* name = ast_value_factory()->empty_string(); |
- |
+ if (name == nullptr) name = ast_value_factory()->empty_string(); |
FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor |
: FunctionKind::kDefaultBaseConstructor; |
@@ -656,13 +655,6 @@ Expression* ParserTraits::FunctionSentExpression(Scope* scope, |
} |
-Expression* ParserTraits::DefaultConstructor(bool call_super, Scope* scope, |
- int pos, int end_pos, |
- LanguageMode mode) { |
- return parser_->DefaultConstructor(call_super, scope, pos, end_pos, mode); |
-} |
- |
- |
Literal* ParserTraits::ExpressionFromLiteral(Token::Value token, int pos, |
Scanner* scanner, |
AstNodeFactory* factory) { |
@@ -1110,10 +1102,10 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info, |
} |
} |
} else if (shared_info->is_default_constructor()) { |
- result = DefaultConstructor(IsSubclassConstructor(shared_info->kind()), |
- scope, shared_info->start_position(), |
- shared_info->end_position(), |
- shared_info->language_mode()); |
+ result = DefaultConstructor( |
+ raw_name, IsSubclassConstructor(shared_info->kind()), scope, |
+ shared_info->start_position(), shared_info->end_position(), |
+ shared_info->language_mode()); |
} else { |
result = ParseFunctionLiteral( |
raw_name, Scanner::Location::invalid(), kSkipFunctionNameCheck, |
@@ -2477,18 +2469,8 @@ void Parser::ParseVariableDeclarations(VariableDeclarationContext var_context, |
} |
} |
- if (allow_harmony_function_name() && single_name) { |
- if (value->IsFunctionLiteral()) { |
- auto function_literal = value->AsFunctionLiteral(); |
- if (function_literal->is_anonymous()) { |
- function_literal->set_raw_name(single_name); |
- } |
- } else if (value->IsClassLiteral()) { |
- auto class_literal = value->AsClassLiteral(); |
- if (class_literal->raw_name() == nullptr) { |
- class_literal->set_raw_name(single_name); |
- } |
- } |
+ if (allow_harmony_function_name()) { |
+ ParserTraits::SetFunctionNameFromIdentifierRef(value, pattern); |
} |
// End position of the initializer is after the assignment expression. |
@@ -4896,24 +4878,27 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
bool is_computed_name = false; // Classes do not care about computed |
// property names here. |
ExpressionClassifier classifier; |
- const AstRawString* name = nullptr; |
+ const AstRawString* property_name = nullptr; |
ObjectLiteral::Property* property = ParsePropertyDefinition( |
&checker, in_class, has_extends, is_static, &is_computed_name, |
- &has_seen_constructor, &classifier, &name, CHECK_OK); |
+ &has_seen_constructor, &classifier, &property_name, CHECK_OK); |
property = ParserTraits::RewriteNonPatternObjectLiteralProperty( |
property, &classifier, CHECK_OK); |
if (has_seen_constructor && constructor == NULL) { |
constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
DCHECK_NOT_NULL(constructor); |
+ constructor->set_raw_name( |
+ name != nullptr ? name : ast_value_factory()->empty_string()); |
} else { |
properties->Add(property, zone()); |
} |
if (fni_ != NULL) fni_->Infer(); |
- if (allow_harmony_function_name()) { |
- SetFunctionNameFromPropertyName(property, name); |
+ if (allow_harmony_function_name() && |
+ property_name != ast_value_factory()->constructor_string()) { |
+ SetFunctionNameFromPropertyName(property, property_name); |
} |
} |
@@ -4921,8 +4906,8 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
int end_pos = scanner()->location().end_pos; |
if (constructor == NULL) { |
- constructor = DefaultConstructor(extends != NULL, block_scope, pos, end_pos, |
- block_scope->language_mode()); |
+ constructor = DefaultConstructor(name, extends != NULL, block_scope, pos, |
+ end_pos, block_scope->language_mode()); |
} |
// Note that we do not finalize this block scope because strong |
@@ -4934,8 +4919,8 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
proxy->var()->set_initializer_position(end_pos); |
} |
- return factory()->NewClassLiteral(name, block_scope, proxy, extends, |
- constructor, properties, pos, end_pos); |
+ return factory()->NewClassLiteral(block_scope, proxy, extends, constructor, |
+ properties, pos, end_pos); |
} |
@@ -5739,7 +5724,7 @@ void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) { |
void ParserTraits::SetFunctionNameFromPropertyName( |
ObjectLiteralProperty* property, const AstRawString* name) { |
Expression* value = property->value(); |
- if (!value->IsFunctionLiteral() && !value->IsClassLiteral()) return; |
+ if (!value->IsAnonymousFunctionDefinition()) return; |
// TODO(adamk): Support computed names. |
if (property->is_computed_name()) return; |
@@ -5749,50 +5734,40 @@ void ParserTraits::SetFunctionNameFromPropertyName( |
// of an object literal. |
if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; |
- if (value->IsFunctionLiteral()) { |
- auto function = value->AsFunctionLiteral(); |
- if (function->is_anonymous()) { |
- if (property->kind() == ObjectLiteralProperty::GETTER) { |
- function->set_raw_name(parser_->ast_value_factory()->NewConsString( |
- parser_->ast_value_factory()->get_space_string(), name)); |
- } else if (property->kind() == ObjectLiteralProperty::SETTER) { |
- function->set_raw_name(parser_->ast_value_factory()->NewConsString( |
- parser_->ast_value_factory()->set_space_string(), name)); |
- } else { |
- function->set_raw_name(name); |
- DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
- } |
+ auto function = value->AsFunctionLiteral(); |
+ if (function != nullptr) { |
+ if (property->kind() == ObjectLiteralProperty::GETTER) { |
+ function->set_raw_name(parser_->ast_value_factory()->NewConsString( |
+ parser_->ast_value_factory()->get_space_string(), name)); |
+ } else if (property->kind() == ObjectLiteralProperty::SETTER) { |
+ function->set_raw_name(parser_->ast_value_factory()->NewConsString( |
+ parser_->ast_value_factory()->set_space_string(), name)); |
+ } else { |
+ function->set_raw_name(name); |
+ DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
} |
} else { |
DCHECK(value->IsClassLiteral()); |
DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
- auto class_literal = value->AsClassLiteral(); |
- if (class_literal->raw_name() == nullptr) { |
- class_literal->set_raw_name(name); |
- } |
+ value->AsClassLiteral()->constructor()->set_raw_name(name); |
} |
} |
void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, |
Expression* identifier) { |
- if (!value->IsFunctionLiteral() && !value->IsClassLiteral()) return; |
+ if (!value->IsAnonymousFunctionDefinition()) return; |
if (!identifier->IsVariableProxy()) return; |
auto name = identifier->AsVariableProxy()->raw_name(); |
DCHECK_NOT_NULL(name); |
- if (value->IsFunctionLiteral()) { |
- auto function = value->AsFunctionLiteral(); |
- if (function->is_anonymous()) { |
- function->set_raw_name(name); |
- } |
+ auto function = value->AsFunctionLiteral(); |
+ if (function != nullptr) { |
+ function->set_raw_name(name); |
} else { |
DCHECK(value->IsClassLiteral()); |
- auto class_literal = value->AsClassLiteral(); |
- if (class_literal->raw_name() == nullptr) { |
- class_literal->set_raw_name(name); |
- } |
+ value->AsClassLiteral()->constructor()->set_raw_name(name); |
} |
} |