| Index: src/parsing/preparser.h
|
| diff --git a/src/parsing/preparser.h b/src/parsing/preparser.h
|
| index a8db6fedc6515f05319e352502bdacc817c8c1b6..fb3e71c7458e48f6dcab7001e27f0025e14f7075 100644
|
| --- a/src/parsing/preparser.h
|
| +++ b/src/parsing/preparser.h
|
| @@ -161,6 +161,11 @@ class PreParserExpression {
|
| IsUseStrictField::encode(true));
|
| }
|
|
|
| + static PreParserExpression UseAsmStringLiteral() {
|
| + return PreParserExpression(TypeField::encode(kStringLiteralExpression) |
|
| + IsUseAsmField::encode(true));
|
| + }
|
| +
|
| static PreParserExpression This() {
|
| return PreParserExpression(TypeField::encode(kExpression) |
|
| ExpressionTypeField::encode(kThisExpression));
|
| @@ -234,6 +239,11 @@ class PreParserExpression {
|
| IsUseStrictField::decode(code_);
|
| }
|
|
|
| + bool IsUseAsmLiteral() const {
|
| + return TypeField::decode(code_) == kStringLiteralExpression &&
|
| + IsUseAsmField::decode(code_);
|
| + }
|
| +
|
| bool IsThis() const {
|
| return TypeField::decode(code_) == kExpression &&
|
| ExpressionTypeField::decode(code_) == kThisExpression;
|
| @@ -341,6 +351,7 @@ class PreParserExpression {
|
| // of the Type field, so they can share the storage.
|
| typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField;
|
| typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField;
|
| + typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField;
|
| typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10>
|
| IdentifierTypeField;
|
| typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField;
|
| @@ -359,13 +370,18 @@ class PreParserList {
|
| PreParserList* operator->() { return this; }
|
| void Add(T, void*) { ++length_; }
|
| int length() const { return length_; }
|
| + static PreParserList Null() { return PreParserList(-1); }
|
| + bool IsNull() const { return length_ == -1; }
|
| +
|
| private:
|
| + explicit PreParserList(int n) : length_(n) {}
|
| int length_;
|
| };
|
|
|
| -
|
| typedef PreParserList<PreParserExpression> PreParserExpressionList;
|
|
|
| +class PreParserStatement;
|
| +typedef PreParserList<PreParserStatement> PreParserStatementList;
|
|
|
| class PreParserStatement {
|
| public:
|
| @@ -389,6 +405,9 @@ class PreParserStatement {
|
| if (expression.IsUseStrictLiteral()) {
|
| return PreParserStatement(kUseStrictExpressionStatement);
|
| }
|
| + if (expression.IsUseAsmLiteral()) {
|
| + return PreParserStatement(kUseAsmExpressionStatement);
|
| + }
|
| if (expression.IsStringLiteral()) {
|
| return PreParserStatement(kStringLiteralExpressionStatement);
|
| }
|
| @@ -396,13 +415,16 @@ class PreParserStatement {
|
| }
|
|
|
| bool IsStringLiteral() {
|
| - return code_ == kStringLiteralExpressionStatement || IsUseStrictLiteral();
|
| + return code_ == kStringLiteralExpressionStatement || IsUseStrictLiteral() ||
|
| + IsUseAsmLiteral();
|
| }
|
|
|
| bool IsUseStrictLiteral() {
|
| return code_ == kUseStrictExpressionStatement;
|
| }
|
|
|
| + bool IsUseAsmLiteral() { return code_ == kUseAsmExpressionStatement; }
|
| +
|
| bool IsFunctionDeclaration() {
|
| return code_ == kFunctionDeclaration;
|
| }
|
| @@ -411,12 +433,19 @@ class PreParserStatement {
|
| return code_ == kJumpStatement;
|
| }
|
|
|
| + // Dummy implementation for making statement->somefunc() work in both Parser
|
| + // and PreParser.
|
| + PreParserStatement* operator->() { return this; }
|
| +
|
| + PreParserStatementList statements() { return PreParserStatementList(); }
|
| +
|
| private:
|
| enum Type {
|
| kUnknownStatement,
|
| kJumpStatement,
|
| kStringLiteralExpressionStatement,
|
| kUseStrictExpressionStatement,
|
| + kUseAsmExpressionStatement,
|
| kFunctionDeclaration
|
| };
|
|
|
| @@ -425,9 +454,6 @@ class PreParserStatement {
|
| };
|
|
|
|
|
| -typedef PreParserList<PreParserStatement> PreParserStatementList;
|
| -
|
| -
|
| class PreParserFactory {
|
| public:
|
| explicit PreParserFactory(void* unused_value_factory) {}
|
| @@ -569,6 +595,16 @@ class PreParserFactory {
|
| return PreParserExpression::Default();
|
| }
|
|
|
| + PreParserStatement NewEmptyStatement(int pos) {
|
| + return PreParserStatement::Default();
|
| + }
|
| +
|
| + PreParserStatement NewBlock(ZoneList<const AstRawString*>* labels,
|
| + int capacity, bool ignore_completion_value,
|
| + 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; }
|
| @@ -591,6 +627,17 @@ struct PreParserFormalParameters : FormalParametersBase {
|
|
|
| class PreParser;
|
|
|
| +class PreParserTarget {
|
| + public:
|
| + PreParserTarget(ParserBase<PreParser>* preparser,
|
| + PreParserStatement statement) {}
|
| +};
|
| +
|
| +class PreParserTargetScope {
|
| + public:
|
| + explicit PreParserTargetScope(ParserBase<PreParser>* preparser) {}
|
| +};
|
| +
|
| template <>
|
| struct ParserTypes<PreParser> {
|
| typedef ParserBase<PreParser> Base;
|
| @@ -607,11 +654,15 @@ struct ParserTypes<PreParser> {
|
| typedef PreParserExpressionList ExpressionList;
|
| typedef PreParserExpressionList PropertyList;
|
| typedef PreParserFormalParameters FormalParameters;
|
| + typedef PreParserStatement Statement;
|
| typedef PreParserStatementList StatementList;
|
| typedef PreParserStatement Block;
|
|
|
| // For constructing objects returned by the traversing functions.
|
| typedef PreParserFactory Factory;
|
| +
|
| + typedef PreParserTarget Target;
|
| + typedef PreParserTargetScope TargetScope;
|
| };
|
|
|
|
|
| @@ -667,7 +718,8 @@ class PreParser : public ParserBase<PreParser> {
|
| bool ok = true;
|
| int start_position = scanner()->peek_location().beg_pos;
|
| parsing_module_ = is_module;
|
| - ParseStatementList(Token::EOS, &ok);
|
| + PreParserStatementList body;
|
| + ParseStatementList(body, Token::EOS, &ok);
|
| if (stack_overflow()) return kPreParseStackOverflow;
|
| if (!ok) {
|
| ReportUnexpectedToken(scanner()->current_token());
|
| @@ -698,8 +750,6 @@ class PreParser : public ParserBase<PreParser> {
|
| bool may_abort, int* use_counts);
|
|
|
| private:
|
| - static const int kLazyParseTrialLimit = 200;
|
| -
|
| // These types form an algebra over syntactic categories that is just
|
| // rich enough to let us recognize and propagate the constructs that
|
| // are either being counted in the preparser data, or is important
|
| @@ -709,39 +759,38 @@ class PreParser : public ParserBase<PreParser> {
|
| // which is set to false if parsing failed; it is unchanged otherwise.
|
| // By making the 'exception handling' explicit, we are forced to check
|
| // for failure at the call sites.
|
| - Statement ParseStatementListItem(bool* ok);
|
| - V8_INLINE void ParseStatementList(int end_token, bool* ok) {
|
| - LazyParsingResult result = ParseStatementList(end_token, false, ok);
|
| - USE(result); // The result is just used in debug modes.
|
| - DCHECK_EQ(result, kLazyParsingComplete);
|
| - }
|
| - LazyParsingResult ParseStatementList(int end_token, bool may_abort, bool* ok);
|
| - Statement ParseStatement(AllowLabelledFunctionStatement allow_function,
|
| - bool* ok);
|
| - Statement ParseSubStatement(AllowLabelledFunctionStatement allow_function,
|
| - bool* ok);
|
| Statement ParseScopedStatement(bool legacy, bool* ok);
|
| - Statement ParseHoistableDeclaration(bool* ok);
|
| + Statement ParseHoistableDeclaration(ZoneList<const AstRawString*>* names,
|
| + bool default_export, bool* ok);
|
| Statement ParseHoistableDeclaration(int pos, ParseFunctionFlags flags,
|
| - bool* ok);
|
| + ZoneList<const AstRawString*>* names,
|
| + bool default_export, bool* ok);
|
| Statement ParseFunctionDeclaration(bool* ok);
|
| - Statement ParseAsyncFunctionDeclaration(bool* ok);
|
| + Statement ParseAsyncFunctionDeclaration(ZoneList<const AstRawString*>* names,
|
| + bool default_export, bool* ok);
|
| Expression ParseAsyncFunctionExpression(bool* ok);
|
| - Statement ParseClassDeclaration(bool* ok);
|
| - Statement ParseBlock(bool* ok);
|
| + Statement ParseClassDeclaration(ZoneList<const AstRawString*>* names,
|
| + bool default_export, bool* ok);
|
| + Statement ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok);
|
| Statement ParseVariableStatement(VariableDeclarationContext var_context,
|
| + ZoneList<const AstRawString*>* names,
|
| bool* ok);
|
| Statement ParseExpressionOrLabelledStatement(
|
| + ZoneList<const AstRawString*>* names,
|
| AllowLabelledFunctionStatement allow_function, bool* ok);
|
| - Statement ParseIfStatement(bool* ok);
|
| + Statement ParseIfStatement(ZoneList<const AstRawString*>* labels, bool* ok);
|
| Statement ParseContinueStatement(bool* ok);
|
| - Statement ParseBreakStatement(bool* ok);
|
| + Statement ParseBreakStatement(ZoneList<const AstRawString*>* labels,
|
| + bool* ok);
|
| Statement ParseReturnStatement(bool* ok);
|
| - Statement ParseWithStatement(bool* ok);
|
| - Statement ParseSwitchStatement(bool* ok);
|
| - Statement ParseDoWhileStatement(bool* ok);
|
| - Statement ParseWhileStatement(bool* ok);
|
| - Statement ParseForStatement(bool* ok);
|
| + Statement ParseWithStatement(ZoneList<const AstRawString*>* labels, bool* ok);
|
| + Statement ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
|
| + bool* ok);
|
| + Statement ParseDoWhileStatement(ZoneList<const AstRawString*>* labels,
|
| + bool* ok);
|
| + Statement ParseWhileStatement(ZoneList<const AstRawString*>* labels,
|
| + bool* ok);
|
| + Statement ParseForStatement(ZoneList<const AstRawString*>* labels, bool* ok);
|
| Statement ParseThrowStatement(bool* ok);
|
| Statement ParseTryStatement(bool* ok);
|
| Statement ParseDebuggerStatement(bool* ok);
|
| @@ -785,6 +834,11 @@ class PreParser : public ParserBase<PreParser> {
|
| TemplateLiteralState* state, int start, PreParserExpression tag);
|
| V8_INLINE void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
|
|
|
| + V8_INLINE void SetLanguageMode(Scope* scope, LanguageMode mode) {
|
| + scope->SetLanguageMode(mode);
|
| + }
|
| + V8_INLINE void SetAsmModule() {}
|
| +
|
| V8_INLINE void MarkCollectedTailCallExpressions() {}
|
| V8_INLINE void MarkTailPosition(PreParserExpression expression) {}
|
|
|
| @@ -899,6 +953,18 @@ class PreParser : public ParserBase<PreParser> {
|
| return false;
|
| }
|
|
|
| + V8_INLINE bool IsUseStrictDirective(PreParserStatement statement) const {
|
| + return statement.IsUseStrictLiteral();
|
| + }
|
| +
|
| + V8_INLINE bool IsUseAsmDirective(PreParserStatement statement) const {
|
| + return statement.IsUseAsmLiteral();
|
| + }
|
| +
|
| + V8_INLINE bool IsStringLiteral(PreParserStatement statement) const {
|
| + return statement.IsStringLiteral();
|
| + }
|
| +
|
| V8_INLINE static PreParserExpression GetPropertyValue(
|
| PreParserExpression property) {
|
| return PreParserExpression::Default();
|
| @@ -1010,11 +1076,28 @@ class PreParser : public ParserBase<PreParser> {
|
| }
|
|
|
| V8_INLINE static PreParserExpressionList NullExpressionList() {
|
| - return PreParserExpressionList();
|
| + return PreParserExpressionList::Null();
|
| + }
|
| +
|
| + V8_INLINE static bool IsNullExpressionList(PreParserExpressionList exprs) {
|
| + return exprs.IsNull();
|
| }
|
|
|
| V8_INLINE static PreParserStatementList NullStatementList() {
|
| - return PreParserStatementList();
|
| + return PreParserStatementList::Null();
|
| + }
|
| +
|
| + V8_INLINE static bool IsNullStatementList(PreParserStatementList stmts) {
|
| + return stmts.IsNull();
|
| + }
|
| +
|
| + V8_INLINE static PreParserStatement NullStatement() {
|
| + 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 static PreParserStatement NullBlock() {
|
| @@ -1186,18 +1269,19 @@ PreParserStatementList PreParser::ParseEagerFunctionBody(
|
| const PreParserFormalParameters& parameters, FunctionKind kind,
|
| FunctionLiteral::FunctionType function_type, bool* ok) {
|
| ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
|
| + PreParserStatementList result;
|
|
|
| Scope* inner_scope = scope();
|
| if (!parameters.is_simple) inner_scope = NewScope(BLOCK_SCOPE);
|
|
|
| {
|
| BlockState block_state(&scope_state_, inner_scope);
|
| - ParseStatementList(Token::RBRACE, ok);
|
| + ParseStatementList(result, Token::RBRACE, ok);
|
| if (!*ok) return PreParserStatementList();
|
| }
|
|
|
| Expect(Token::RBRACE, ok);
|
| - return PreParserStatementList();
|
| + return result;
|
| }
|
|
|
| PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state,
|
|
|