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 |