| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index fac3ec694afaa90ad2dc3c213572b8f60d6baede..0781f0ec9c98b0345fadfeb617c005d43110e2a1 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -133,8 +133,7 @@
|
| // typedef ObjectLiteralProperty;
|
| // typedef ClassLiteralProperty;
|
| // typedef ExpressionList;
|
| -// typedef ObjectPropertyList;
|
| -// typedef ClassPropertyList;
|
| +// typedef PropertyList;
|
| // typedef FormalParameters;
|
| // typedef Statement;
|
| // typedef StatementList;
|
| @@ -162,6 +161,7 @@
|
| typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT;
|
| typedef typename Types::ClassLiteralProperty ClassLiteralPropertyT;
|
| typedef typename Types::ExpressionList ExpressionListT;
|
| + typedef typename Types::PropertyList PropertyListT;
|
| typedef typename Types::FormalParameters FormalParametersT;
|
| typedef typename Types::Statement StatementT;
|
| typedef typename Types::StatementList StatementListT;
|
| @@ -671,25 +671,6 @@
|
| DeclarationParsingResult parsing_result;
|
| };
|
|
|
| - struct ClassInfo {
|
| - public:
|
| - explicit ClassInfo(ParserBase* parser)
|
| - : proxy(nullptr),
|
| - extends(parser->impl()->EmptyExpression()),
|
| - properties(parser->impl()->NewClassPropertyList(4)),
|
| - instance_field_initializers(parser->impl()->NewExpressionList(0)),
|
| - constructor(parser->impl()->EmptyFunctionLiteral()),
|
| - has_seen_constructor(false),
|
| - static_initializer_var(nullptr) {}
|
| - VariableProxy* proxy;
|
| - ExpressionT extends;
|
| - typename Types::ClassPropertyList properties;
|
| - ExpressionListT instance_field_initializers;
|
| - FunctionLiteralT constructor;
|
| - bool has_seen_constructor;
|
| - Variable* static_initializer_var;
|
| - };
|
| -
|
| DeclarationScope* NewScriptScope() const {
|
| return new (zone()) DeclarationScope(zone(), ast_value_factory());
|
| }
|
| @@ -1193,10 +1174,6 @@
|
| FunctionKind kind, FunctionBodyType type,
|
| bool accept_IN, int pos, bool* ok);
|
| ExpressionT ParseAsyncFunctionLiteral(bool* ok);
|
| - ExpressionT ParseClassLiteral(IdentifierT name,
|
| - Scanner::Location class_name_location,
|
| - bool name_is_strict_reserved,
|
| - int class_token_pos, bool* ok);
|
| ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok);
|
| ExpressionT ParseSuperExpression(bool is_new, bool* ok);
|
| ExpressionT ParseNewTargetExpression(bool* ok);
|
| @@ -1218,9 +1195,6 @@
|
| StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags,
|
| ZoneList<const AstRawString*>* names,
|
| bool default_export, bool* ok);
|
| - StatementT ParseClassDeclaration(ZoneList<const AstRawString*>* names,
|
| - bool default_export, bool* ok);
|
| - StatementT ParseNativeDeclaration(bool* ok);
|
|
|
| // Under some circumstances, we allow preparsing to abort if the preparsed
|
| // function is "long and trivial", and fully parse instead. Our current
|
| @@ -1809,7 +1783,7 @@
|
| case Token::CLASS: {
|
| BindingPatternUnexpectedToken();
|
| Consume(Token::CLASS);
|
| - int class_token_pos = position();
|
| + int class_token_position = position();
|
| IdentifierT name = impl()->EmptyIdentifier();
|
| bool is_strict_reserved_name = false;
|
| Scanner::Location class_name_location = Scanner::Location::invalid();
|
| @@ -1818,8 +1792,9 @@
|
| CHECK_OK);
|
| class_name_location = scanner()->location();
|
| }
|
| - return ParseClassLiteral(name, class_name_location,
|
| - is_strict_reserved_name, class_token_pos, ok);
|
| + return impl()->ParseClassLiteral(name, class_name_location,
|
| + is_strict_reserved_name,
|
| + class_token_position, ok);
|
| }
|
|
|
| case Token::TEMPLATE_SPAN:
|
| @@ -2481,8 +2456,7 @@
|
| // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'
|
|
|
| int pos = peek_position();
|
| - typename Types::ObjectPropertyList properties =
|
| - impl()->NewObjectPropertyList(4);
|
| + PropertyListT properties = impl()->NewPropertyList(4);
|
| int number_of_boilerplate_properties = 0;
|
| bool has_computed_names = false;
|
| ObjectLiteralChecker checker(this);
|
| @@ -3727,72 +3701,6 @@
|
| }
|
|
|
| template <typename Impl>
|
| -typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseClassDeclaration(
|
| - ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
|
| - // ClassDeclaration ::
|
| - // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'
|
| - // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}'
|
| - //
|
| - // The anonymous form is allowed iff [default_export] is true.
|
| - //
|
| - // 'class' is expected to be consumed by the caller.
|
| - //
|
| - // A ClassDeclaration
|
| - //
|
| - // class C { ... }
|
| - //
|
| - // has the same semantics as:
|
| - //
|
| - // let C = class C { ... };
|
| - //
|
| - // so rewrite it as such.
|
| -
|
| - int class_token_pos = position();
|
| - IdentifierT name = impl()->EmptyIdentifier();
|
| - bool is_strict_reserved = false;
|
| - IdentifierT variable_name = impl()->EmptyIdentifier();
|
| - if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) {
|
| - impl()->GetDefaultStrings(&name, &variable_name);
|
| - } else {
|
| - name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved,
|
| - CHECK_OK_CUSTOM(NullStatement));
|
| - variable_name = name;
|
| - }
|
| -
|
| - ExpressionClassifier no_classifier(this);
|
| - ExpressionT value =
|
| - ParseClassLiteral(name, scanner()->location(), is_strict_reserved,
|
| - class_token_pos, CHECK_OK_CUSTOM(NullStatement));
|
| - int end_pos = position();
|
| - return impl()->DeclareClass(variable_name, value, names, class_token_pos,
|
| - end_pos, ok);
|
| -}
|
| -
|
| -// Language extension which is only enabled for source files loaded
|
| -// through the API's extension mechanism. A native function
|
| -// declaration is resolved by looking up the function through a
|
| -// callback provided by the extension.
|
| -template <typename Impl>
|
| -typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseNativeDeclaration(
|
| - bool* ok) {
|
| - int pos = peek_position();
|
| - Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement));
|
| - // Allow "eval" or "arguments" for backward compatibility.
|
| - IdentifierT name = ParseIdentifier(kAllowRestrictedIdentifiers,
|
| - CHECK_OK_CUSTOM(NullStatement));
|
| - Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullStatement));
|
| - if (peek() != Token::RPAREN) {
|
| - do {
|
| - ParseIdentifier(kAllowRestrictedIdentifiers,
|
| - CHECK_OK_CUSTOM(NullStatement));
|
| - } while (Check(Token::COMMA));
|
| - }
|
| - Expect(Token::RPAREN, CHECK_OK_CUSTOM(NullStatement));
|
| - Expect(Token::SEMICOLON, CHECK_OK_CUSTOM(NullStatement));
|
| - return impl()->DeclareNative(name, pos, ok);
|
| -}
|
| -
|
| -template <typename Impl>
|
| typename ParserBase<Impl>::StatementT
|
| ParserBase<Impl>::ParseAsyncFunctionDeclaration(
|
| ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
|
| @@ -4023,69 +3931,9 @@
|
| function_literal->set_should_be_used_once_hint();
|
| }
|
|
|
| - impl()->AddFunctionForNameInference(function_literal);
|
| + impl()->InferFunctionName(function_literal);
|
|
|
| return function_literal;
|
| -}
|
| -
|
| -template <typename Impl>
|
| -typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseClassLiteral(
|
| - IdentifierT name, Scanner::Location class_name_location,
|
| - bool name_is_strict_reserved, int class_token_pos, bool* ok) {
|
| - // All parts of a ClassDeclaration and ClassExpression are strict code.
|
| - if (name_is_strict_reserved) {
|
| - impl()->ReportMessageAt(class_name_location,
|
| - MessageTemplate::kUnexpectedStrictReserved);
|
| - *ok = false;
|
| - return impl()->EmptyExpression();
|
| - }
|
| - if (impl()->IsEvalOrArguments(name)) {
|
| - impl()->ReportMessageAt(class_name_location,
|
| - MessageTemplate::kStrictEvalArguments);
|
| - *ok = false;
|
| - return impl()->EmptyExpression();
|
| - }
|
| -
|
| - BlockState block_state(zone(), &scope_state_);
|
| - RaiseLanguageMode(STRICT);
|
| -
|
| - ClassInfo class_info(this);
|
| - impl()->DeclareClassVariable(name, block_state.scope(), &class_info,
|
| - class_token_pos, CHECK_OK);
|
| -
|
| - if (Check(Token::EXTENDS)) {
|
| - block_state.set_start_position(scanner()->location().end_pos);
|
| - ExpressionClassifier extends_classifier(this);
|
| - class_info.extends = ParseLeftHandSideExpression(CHECK_OK);
|
| - impl()->RewriteNonPattern(CHECK_OK);
|
| - impl()->AccumulateFormalParameterContainmentErrors();
|
| - } else {
|
| - block_state.set_start_position(scanner()->location().end_pos);
|
| - }
|
| -
|
| - ClassLiteralChecker checker(this);
|
| -
|
| - Expect(Token::LBRACE, CHECK_OK);
|
| -
|
| - const bool has_extends = !impl()->IsEmptyExpression(class_info.extends);
|
| - while (peek() != Token::RBRACE) {
|
| - if (Check(Token::SEMICOLON)) continue;
|
| - FuncNameInferrer::State fni_state(fni_);
|
| - bool is_computed_name = false; // Classes do not care about computed
|
| - // property names here.
|
| - ExpressionClassifier property_classifier(this);
|
| - ClassLiteralPropertyT property = ParseClassPropertyDefinition(
|
| - &checker, has_extends, &is_computed_name,
|
| - &class_info.has_seen_constructor, CHECK_OK);
|
| - impl()->RewriteNonPattern(CHECK_OK);
|
| - impl()->AccumulateFormalParameterContainmentErrors();
|
| -
|
| - impl()->DeclareClassProperty(name, property, &class_info, CHECK_OK);
|
| - impl()->InferFunctionName();
|
| - }
|
| -
|
| - Expect(Token::RBRACE, CHECK_OK);
|
| - return impl()->RewriteClassLiteral(name, &class_info, class_token_pos, ok);
|
| }
|
|
|
| template <typename Impl>
|
| @@ -4439,7 +4287,7 @@
|
| return ParseHoistableDeclaration(nullptr, false, ok);
|
| case Token::CLASS:
|
| Consume(Token::CLASS);
|
| - return ParseClassDeclaration(nullptr, false, ok);
|
| + return impl()->ParseClassDeclaration(nullptr, false, ok);
|
| case Token::VAR:
|
| case Token::CONST:
|
| return ParseVariableStatement(kStatementListItem, nullptr, ok);
|
| @@ -4717,7 +4565,7 @@
|
| if (extension_ != nullptr && peek() == Token::FUNCTION &&
|
| !scanner()->HasAnyLineTerminatorBeforeNext() && impl()->IsNative(expr) &&
|
| !scanner()->literal_contains_escapes()) {
|
| - return ParseNativeDeclaration(ok);
|
| + return impl()->ParseNativeDeclaration(ok);
|
| }
|
|
|
| // Parsed expression statement, followed by semicolon.
|
|
|