| Index: src/parsing/preparser.h
|
| diff --git a/src/parsing/preparser.h b/src/parsing/preparser.h
|
| index d41aa66bc9ee77f33d84979111bc3f7fbcac9ba4..9ba67930351315717b1f0ac09b824dc0e2e669d1 100644
|
| --- a/src/parsing/preparser.h
|
| +++ b/src/parsing/preparser.h
|
| @@ -25,6 +25,9 @@ class PreParserIdentifier {
|
| static PreParserIdentifier Default() {
|
| return PreParserIdentifier(kUnknownIdentifier);
|
| }
|
| + static PreParserIdentifier Empty() {
|
| + return PreParserIdentifier(kEmptyIdentifier);
|
| + }
|
| static PreParserIdentifier Eval() {
|
| return PreParserIdentifier(kEvalIdentifier);
|
| }
|
| @@ -64,6 +67,7 @@ class PreParserIdentifier {
|
| static PreParserIdentifier Async() {
|
| return PreParserIdentifier(kAsyncIdentifier);
|
| }
|
| + bool IsEmpty() const { return type_ == kEmptyIdentifier; }
|
| bool IsEval() const { return type_ == kEvalIdentifier; }
|
| bool IsArguments() const { return type_ == kArgumentsIdentifier; }
|
| bool IsEvalOrArguments() const { return IsEval() || IsArguments(); }
|
| @@ -91,6 +95,7 @@ class PreParserIdentifier {
|
|
|
| private:
|
| enum Type {
|
| + kEmptyIdentifier,
|
| kUnknownIdentifier,
|
| kFutureReservedIdentifier,
|
| kFutureStrictReservedIdentifier,
|
| @@ -389,6 +394,14 @@ class PreParserStatement {
|
| return PreParserStatement(kUnknownStatement);
|
| }
|
|
|
| + static PreParserStatement Null() {
|
| + return PreParserStatement(kNullStatement);
|
| + }
|
| +
|
| + static PreParserStatement Empty() {
|
| + return PreParserStatement(kEmptyStatement);
|
| + }
|
| +
|
| static PreParserStatement Jump() {
|
| return PreParserStatement(kJumpStatement);
|
| }
|
| @@ -425,6 +438,10 @@ class PreParserStatement {
|
| return code_ == kJumpStatement;
|
| }
|
|
|
| + bool IsNullStatement() { return code_ == kNullStatement; }
|
| +
|
| + bool IsEmptyStatement() { return code_ == kEmptyStatement; }
|
| +
|
| // Dummy implementation for making statement->somefunc() work in both Parser
|
| // and PreParser.
|
| PreParserStatement* operator->() { return this; }
|
| @@ -434,6 +451,8 @@ class PreParserStatement {
|
|
|
| private:
|
| enum Type {
|
| + kNullStatement,
|
| + kEmptyStatement,
|
| kUnknownStatement,
|
| kJumpStatement,
|
| kStringLiteralExpressionStatement,
|
| @@ -559,7 +578,7 @@ class PreParserFactory {
|
| }
|
| PreParserStatement NewReturnStatement(PreParserExpression expression,
|
| int pos) {
|
| - return PreParserStatement::Default();
|
| + return PreParserStatement::Jump();
|
| }
|
| PreParserExpression NewFunctionLiteral(
|
| PreParserIdentifier name, Scope* scope, PreParserStatementList body,
|
| @@ -595,6 +614,32 @@ class PreParserFactory {
|
| return PreParserStatement::Default();
|
| }
|
|
|
| + PreParserStatement NewExpressionStatement(PreParserExpression expr, int pos) {
|
| + return PreParserStatement::ExpressionStatement(expr);
|
| + }
|
| +
|
| + PreParserStatement NewIfStatement(PreParserExpression condition,
|
| + PreParserStatement then_statement,
|
| + PreParserStatement else_statement,
|
| + int pos) {
|
| + // This must return a jump statement iff both clauses are jump statements.
|
| + return else_statement.IsJumpStatement() ? then_statement : else_statement;
|
| + }
|
| +
|
| + PreParserStatement NewBreakStatement(PreParserStatement target, int pos) {
|
| + return PreParserStatement::Jump();
|
| + }
|
| +
|
| + PreParserStatement NewContinueStatement(PreParserStatement target, int pos) {
|
| + return PreParserStatement::Jump();
|
| + }
|
| +
|
| + PreParserStatement NewWithStatement(Scope* scope,
|
| + PreParserExpression expression,
|
| + PreParserStatement statement, int pos) {
|
| + return PreParserStatement::Default();
|
| + }
|
| +
|
| // Return the object itself as AstVisitor and implement the needed
|
| // dummy method right in this class.
|
| PreParserFactory* visitor() { return this; }
|
| @@ -648,6 +693,8 @@ struct ParserTypes<PreParser> {
|
| typedef PreParserStatement Statement;
|
| typedef PreParserStatementList StatementList;
|
| typedef PreParserStatement Block;
|
| + typedef PreParserStatement BreakableStatementT;
|
| + typedef PreParserStatement IterationStatementT;
|
|
|
| // For constructing objects returned by the traversing functions.
|
| typedef PreParserFactory Factory;
|
| @@ -756,15 +803,6 @@ class PreParser : public ParserBase<PreParser> {
|
| Expression ParseAsyncFunctionExpression(bool* ok);
|
| Statement ParseClassDeclaration(ZoneList<const AstRawString*>* names,
|
| bool default_export, bool* ok);
|
| - Statement ParseExpressionOrLabelledStatement(
|
| - ZoneList<const AstRawString*>* names,
|
| - AllowLabelledFunctionStatement allow_function, bool* ok);
|
| - Statement ParseIfStatement(ZoneList<const AstRawString*>* labels, bool* ok);
|
| - Statement ParseContinueStatement(bool* ok);
|
| - Statement ParseBreakStatement(ZoneList<const AstRawString*>* labels,
|
| - bool* ok);
|
| - Statement ParseReturnStatement(bool* ok);
|
| - Statement ParseWithStatement(ZoneList<const AstRawString*>* labels, bool* ok);
|
| Statement ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
|
| bool* ok);
|
| Statement ParseDoWhileStatement(ZoneList<const AstRawString*>* labels,
|
| @@ -865,6 +903,42 @@ class PreParser : public ParserBase<PreParser> {
|
| const DeclarationDescriptor* declaration_descriptor,
|
| const DeclarationParsingResult::Declaration* declaration,
|
| ZoneList<const AstRawString*>* names, bool* ok) {}
|
| + V8_INLINE ZoneList<const AstRawString*>* DeclareLabel(
|
| + ZoneList<const AstRawString*>* labels, PreParserExpression expr,
|
| + bool* ok) {
|
| + DCHECK(!expr.AsIdentifier().IsEnum());
|
| + DCHECK(!parsing_module_ || !expr.AsIdentifier().IsAwait());
|
| + DCHECK(is_sloppy(language_mode()) ||
|
| + !IsFutureStrictReserved(expr.AsIdentifier()));
|
| + return labels;
|
| + }
|
| +
|
| + V8_INLINE PreParserStatement ParseNativeDeclaration(bool* ok) {
|
| + UNREACHABLE();
|
| + return PreParserStatement::Default();
|
| + }
|
| +
|
| + // TODO(nikolaos): The preparser currently does not keep track of labels.
|
| + V8_INLINE bool ContainsLabel(ZoneList<const AstRawString*>* labels,
|
| + PreParserIdentifier label) {
|
| + return false;
|
| + }
|
| +
|
| + V8_INLINE PreParserExpression RewriteReturn(PreParserExpression return_value,
|
| + int pos) {
|
| + return return_value;
|
| + }
|
| +
|
| + // TODO(nikolaos): The preparser currently does not keep track of labels
|
| + // and targets.
|
| + V8_INLINE PreParserStatement LookupBreakTarget(PreParserIdentifier label,
|
| + bool* ok) {
|
| + return PreParserStatement::Default();
|
| + }
|
| + V8_INLINE PreParserStatement LookupContinueTarget(PreParserIdentifier label,
|
| + bool* ok) {
|
| + return PreParserStatement::Default();
|
| + }
|
|
|
| V8_INLINE PreParserStatement DeclareFunction(
|
| PreParserIdentifier variable_name, PreParserExpression function, int pos,
|
| @@ -917,6 +991,11 @@ class PreParser : public ParserBase<PreParser> {
|
| return expression.AsIdentifier();
|
| }
|
|
|
| + V8_INLINE static PreParserExpression AsIdentifierExpression(
|
| + PreParserExpression expression) {
|
| + return expression;
|
| + }
|
| +
|
| V8_INLINE bool IsPrototype(PreParserIdentifier identifier) const {
|
| return identifier.IsPrototype();
|
| }
|
| @@ -934,6 +1013,14 @@ class PreParser : public ParserBase<PreParser> {
|
| return false;
|
| }
|
|
|
| + V8_INLINE bool IsNative(PreParserExpression expr) const {
|
| + // Preparsing is disabled for extensions (because the extension
|
| + // details aren't passed to lazily compiled functions), so we
|
| + // don't accept "native function" in the preparser and there is
|
| + // no need to keep track of "native".
|
| + return false;
|
| + }
|
| +
|
| V8_INLINE static bool IsArrayIndex(PreParserIdentifier string,
|
| uint32_t* index) {
|
| return false;
|
| @@ -1021,14 +1108,17 @@ class PreParser : public ParserBase<PreParser> {
|
|
|
| V8_INLINE void ReportMessageAt(Scanner::Location source_location,
|
| MessageTemplate::Template message,
|
| - const AstRawString* arg,
|
| + PreParserIdentifier arg,
|
| ParseErrorType error_type = kSyntaxError) {
|
| UNREACHABLE();
|
| }
|
|
|
| // "null" return type creators.
|
| V8_INLINE static PreParserIdentifier EmptyIdentifier() {
|
| - return PreParserIdentifier::Default();
|
| + return PreParserIdentifier::Empty();
|
| + }
|
| + V8_INLINE static bool IsEmptyIdentifier(PreParserIdentifier name) {
|
| + return name.IsEmpty();
|
| }
|
| V8_INLINE static PreParserExpression EmptyExpression() {
|
| return PreParserExpression::Empty();
|
| @@ -1070,9 +1160,12 @@ class PreParser : public ParserBase<PreParser> {
|
| return PreParserStatement::Default();
|
| }
|
|
|
| - V8_INLINE bool IsNullOrEmptyStatement(PreParserStatement stmt) {
|
| - // TODO(nikolaos): See if this needs to be consistent for the preparser.
|
| - return false;
|
| + V8_INLINE bool IsNullStatement(PreParserStatement stmt) {
|
| + return stmt.IsNullStatement();
|
| + }
|
| +
|
| + V8_INLINE bool IsEmptyStatement(PreParserStatement stmt) {
|
| + return stmt.IsEmptyStatement();
|
| }
|
|
|
| V8_INLINE static PreParserStatement NullBlock() {
|
|
|