Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index 99c93b88faffa57bcf087fdac07ad9010688cafa..b2cf3b1a6d385ee7d79b9b46bcda1dc2dd209346 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -685,13 +685,6 @@ Expression* ParserTraits::SuperReference(Scope* scope, AstNodeFactory* factory, |
| pos); |
| } |
| -Expression* ParserTraits::ClassExpression( |
| - const AstRawString* name, Expression* extends, Expression* constructor, |
| - ZoneList<ObjectLiteral::Property*>* properties, int start_position, |
| - int end_position, AstNodeFactory* factory) { |
| - return factory->NewClassLiteral(name, extends, constructor, properties, |
| - start_position, end_position); |
| -} |
| Expression* ParserTraits::DefaultConstructor(bool call_super, Scope* scope, |
| int pos, int end_pos) { |
| @@ -777,6 +770,14 @@ FunctionLiteral* ParserTraits::ParseFunctionLiteral( |
| } |
| +ClassLiteral* ParserTraits::ParseClassLiteral( |
| + const AstRawString* name, Scanner::Location class_name_location, |
| + bool name_is_strict_reserved, int pos, bool* ok) { |
| + return parser_->ParseClassLiteral(name, class_name_location, |
| + name_is_strict_reserved, pos, ok); |
| +} |
| + |
| + |
| Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) |
| : ParserBase<ParserTraits>(&scanner_, parse_info->stack_limit, |
| info->extension(), NULL, info->zone(), this), |
| @@ -1993,8 +1994,8 @@ Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
| bool is_strict_reserved = false; |
| const AstRawString* name = |
| ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| - Expression* value = ParseClassLiteral(name, scanner()->location(), |
| - is_strict_reserved, pos, CHECK_OK); |
| + ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), |
| + is_strict_reserved, pos, CHECK_OK); |
| VariableProxy* proxy = NewUnresolved(name, LET, Interface::NewValue()); |
| Declaration* declaration = |
| @@ -3893,6 +3894,90 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
| } |
| +ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
|
marja
2015/02/10 11:31:49
Is there a reason why ParseClassLiteral is not in
|
| + Scanner::Location class_name_location, |
| + bool name_is_strict_reserved, int pos, |
| + bool* ok) { |
| + // All parts of a ClassDeclaration and ClassExpression are strict code. |
| + if (name_is_strict_reserved) { |
| + ReportMessageAt(class_name_location, "unexpected_strict_reserved"); |
| + *ok = false; |
| + return NULL; |
| + } |
| + if (IsEvalOrArguments(name)) { |
| + ReportMessageAt(class_name_location, "strict_eval_arguments"); |
| + *ok = false; |
| + return NULL; |
| + } |
| + |
| + Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); |
| + BlockState block_state(&scope_, block_scope); |
| + scope_->SetStrictMode(STRICT); |
| + scope_->SetScopeName(name); |
| + |
| + VariableProxy* proxy = NULL; |
| + if (name != NULL) { |
| + proxy = NewUnresolved(name, CONST, Interface::NewConst()); |
| + Declaration* declaration = |
| + factory()->NewVariableDeclaration(proxy, CONST, block_scope, pos); |
| + Declare(declaration, true, CHECK_OK); |
| + } |
| + |
| + Expression* extends = NULL; |
| + if (Check(Token::EXTENDS)) { |
| + block_scope->set_start_position(scanner()->location().end_pos); |
| + extends = ParseLeftHandSideExpression(CHECK_OK); |
| + } else { |
| + block_scope->set_start_position(scanner()->location().end_pos); |
| + } |
| + |
| + ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4, zone()); |
| + Expression* constructor = NULL; |
| + bool has_seen_constructor = false; |
| + |
| + Expect(Token::LBRACE, CHECK_OK); |
| + while (peek() != Token::RBRACE) { |
| + if (Check(Token::SEMICOLON)) continue; |
| + if (fni_ != NULL) fni_->Enter(); |
| + const bool in_class = true; |
| + const bool is_static = false; |
| + ObjectLiteral::Property* property = ParsePropertyDefinition( |
| + NULL, in_class, is_static, &has_seen_constructor, CHECK_OK); |
| + |
| + if (has_seen_constructor && constructor == NULL) { |
| + constructor = GetPropertyValue(property); |
| + } else { |
| + properties->Add(property, zone()); |
| + } |
| + |
| + if (fni_ != NULL) { |
| + fni_->Infer(); |
| + fni_->Leave(); |
| + } |
| + } |
| + |
| + Expect(Token::RBRACE, CHECK_OK); |
| + int end_pos = scanner()->location().end_pos; |
| + |
| + if (constructor == NULL) { |
| + constructor = |
| + DefaultConstructor(extends != NULL, block_scope, pos, end_pos); |
| + } |
| + |
| + block_scope->set_end_position(end_pos); |
| + block_scope = block_scope->FinalizeBlockScope(); |
| + |
| + if (name != NULL) { |
| + DCHECK_NOT_NULL(proxy); |
| + DCHECK_NOT_NULL(block_scope); |
| + proxy->var()->set_initializer_position(end_pos); |
| + } |
| + |
| + return factory()->NewClassLiteral(name, block_scope, proxy, extends, |
| + constructor, properties, pos, end_pos); |
| +} |
| + |
| + |
| Expression* Parser::ParseV8Intrinsic(bool* ok) { |
| // CallRuntime :: |
| // '%' Identifier Arguments |