| Index: src/preparser.h
|
| diff --git a/src/preparser.h b/src/preparser.h
|
| index c44731279e734bf9387f9fe2111c481919e7af53..dd053615bfb70d3b7784a865c46d3902f10fede8 100644
|
| --- a/src/preparser.h
|
| +++ b/src/preparser.h
|
| @@ -490,10 +490,6 @@ class ParserBase : public Traits {
|
| bool* ok);
|
| ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast,
|
| bool* ok);
|
| - ExpressionT ParseClassLiteral(IdentifierT name,
|
| - Scanner::Location function_name_location,
|
| - bool name_is_strict_reserved, int pos,
|
| - bool* ok);
|
|
|
| // Checks if the expression is a valid reference expression (e.g., on the
|
| // left-hand side of assignments). Although ruled out by ECMA as early errors,
|
| @@ -1090,12 +1086,13 @@ class PreParserFactory {
|
| int position) {
|
| return PreParserExpression::Default();
|
| }
|
| - PreParserExpression NewClassLiteral(PreParserIdentifier name,
|
| - PreParserExpression extends,
|
| - PreParserExpression constructor,
|
| - PreParserExpressionList properties,
|
| - int start_position, int end_position) {
|
| - return PreParserExpression::Default();
|
| +
|
| + // Return the object itself as AstVisitor and implement the needed
|
| + // dummy method right in this class.
|
| + PreParserFactory* visitor() { return this; }
|
| + int* ast_properties() {
|
| + static int dummy = 42;
|
| + return &dummy;
|
| }
|
| };
|
|
|
| @@ -1308,13 +1305,6 @@ class PreParserTraits {
|
| return PreParserExpression::Super();
|
| }
|
|
|
| - static PreParserExpression ClassExpression(
|
| - PreParserIdentifier name, PreParserExpression extends,
|
| - PreParserExpression constructor, PreParserExpressionList properties,
|
| - int start_position, int end_position, PreParserFactory* factory) {
|
| - return PreParserExpression::Default();
|
| - }
|
| -
|
| static PreParserExpression DefaultConstructor(bool call_super,
|
| PreParserScope* scope, int pos,
|
| int end_pos) {
|
| @@ -1387,6 +1377,11 @@ class PreParserTraits {
|
| int function_token_position, FunctionLiteral::FunctionType type,
|
| FunctionLiteral::ArityRestriction arity_restriction, bool* ok);
|
|
|
| + PreParserExpression ParseClassLiteral(PreParserIdentifier name,
|
| + Scanner::Location class_name_location,
|
| + bool name_is_strict_reserved, int pos,
|
| + bool* ok);
|
| +
|
| private:
|
| PreParser* pre_parser_;
|
| };
|
| @@ -1524,6 +1519,11 @@ class PreParser : public ParserBase<PreParserTraits> {
|
| FunctionLiteral::ArityRestriction arity_restriction, bool* ok);
|
| void ParseLazyFunctionLiteralBody(bool* ok);
|
|
|
| + PreParserExpression ParseClassLiteral(PreParserIdentifier name,
|
| + Scanner::Location class_name_location,
|
| + bool name_is_strict_reserved, int pos,
|
| + bool* ok);
|
| +
|
| bool CheckInOrOf(bool accept_OF);
|
| };
|
|
|
| @@ -2722,78 +2722,6 @@ typename ParserBase<Traits>::ExpressionT ParserBase<
|
| }
|
|
|
|
|
| -template <class Traits>
|
| -typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseClassLiteral(
|
| - IdentifierT name, Scanner::Location class_name_location,
|
| - bool name_is_strict_reserved, int pos, bool* ok) {
|
| - // All parts of a ClassDeclaration or a ClassExpression are strict code.
|
| - if (name_is_strict_reserved) {
|
| - ReportMessageAt(class_name_location, "unexpected_strict_reserved");
|
| - *ok = false;
|
| - return this->EmptyExpression();
|
| - }
|
| - if (this->IsEvalOrArguments(name)) {
|
| - ReportMessageAt(class_name_location, "strict_eval_arguments");
|
| - *ok = false;
|
| - return this->EmptyExpression();
|
| - }
|
| -
|
| - bool has_extends = false;
|
| - ExpressionT extends = this->EmptyExpression();
|
| - if (Check(Token::EXTENDS)) {
|
| - typename Traits::Type::ScopePtr scope = this->NewScope(scope_, BLOCK_SCOPE);
|
| - BlockState block_state(&scope_, Traits::Type::ptr_to_scope(scope));
|
| - scope_->SetStrictMode(STRICT);
|
| - extends = this->ParseLeftHandSideExpression(CHECK_OK);
|
| - has_extends = true;
|
| - }
|
| -
|
| - // TODO(arv): Implement scopes and name binding in class body only.
|
| - typename Traits::Type::ScopePtr scope = this->NewScope(scope_, BLOCK_SCOPE);
|
| - BlockState block_state(&scope_, Traits::Type::ptr_to_scope(scope));
|
| - scope_->SetStrictMode(STRICT);
|
| - scope_->SetScopeName(name);
|
| -
|
| - typename Traits::Type::PropertyList properties =
|
| - this->NewPropertyList(4, zone_);
|
| - ExpressionT constructor = this->EmptyExpression();
|
| - 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;
|
| - bool old_has_seen_constructor = has_seen_constructor;
|
| - ObjectLiteralPropertyT property = this->ParsePropertyDefinition(
|
| - NULL, in_class, is_static, &has_seen_constructor, CHECK_OK);
|
| -
|
| - if (has_seen_constructor != old_has_seen_constructor) {
|
| - constructor = this->GetPropertyValue(property);
|
| - } else {
|
| - properties->Add(property, zone());
|
| - }
|
| -
|
| - if (fni_ != NULL) {
|
| - fni_->Infer();
|
| - fni_->Leave();
|
| - }
|
| - }
|
| -
|
| - int end_pos = peek_position();
|
| - Expect(Token::RBRACE, CHECK_OK);
|
| -
|
| - if (!has_seen_constructor) {
|
| - constructor =
|
| - this->DefaultConstructor(has_extends, scope_, pos, end_pos + 1);
|
| - }
|
| -
|
| - return this->ClassExpression(name, extends, constructor, properties, pos,
|
| - end_pos + 1, factory());
|
| -}
|
| -
|
| -
|
| template <typename Traits>
|
| typename ParserBase<Traits>::ExpressionT
|
| ParserBase<Traits>::CheckAndRewriteReferenceExpression(
|
|
|