| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index c4f481083ceb6347941355933020480481e21027..7dc60cb2d53f4fc495c1c07680374be80bab1df5 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -101,15 +101,17 @@ RegExpBuilder::RegExpBuilder(Zone* zone)
|
| terms_(),
|
| alternatives_()
|
| #ifdef DEBUG
|
| - , last_added_(ADD_NONE)
|
| + ,
|
| + last_added_(ADD_NONE)
|
| #endif
|
| - {}
|
| +{
|
| +}
|
|
|
|
|
| void RegExpBuilder::FlushCharacters() {
|
| pending_empty_ = false;
|
| if (characters_ != NULL) {
|
| - RegExpTree* atom = new(zone()) RegExpAtom(characters_->ToConstVector());
|
| + RegExpTree* atom = new (zone()) RegExpAtom(characters_->ToConstVector());
|
| characters_ = NULL;
|
| text_.Add(atom, zone());
|
| LAST(ADD_ATOM);
|
| @@ -125,9 +127,8 @@ void RegExpBuilder::FlushText() {
|
| } else if (num_text == 1) {
|
| terms_.Add(text_.last(), zone());
|
| } else {
|
| - RegExpText* text = new(zone()) RegExpText(zone());
|
| - for (int i = 0; i < num_text; i++)
|
| - text_.Get(i)->AppendToText(text, zone());
|
| + RegExpText* text = new (zone()) RegExpText(zone());
|
| + for (int i = 0; i < num_text; i++) text_.Get(i)->AppendToText(text, zone());
|
| terms_.Add(text, zone());
|
| }
|
| text_.Clear();
|
| @@ -137,16 +138,14 @@ void RegExpBuilder::FlushText() {
|
| void RegExpBuilder::AddCharacter(uc16 c) {
|
| pending_empty_ = false;
|
| if (characters_ == NULL) {
|
| - characters_ = new(zone()) ZoneList<uc16>(4, zone());
|
| + characters_ = new (zone()) ZoneList<uc16>(4, zone());
|
| }
|
| characters_->Add(c, zone());
|
| LAST(ADD_CHAR);
|
| }
|
|
|
|
|
| -void RegExpBuilder::AddEmpty() {
|
| - pending_empty_ = true;
|
| -}
|
| +void RegExpBuilder::AddEmpty() { pending_empty_ = true; }
|
|
|
|
|
| void RegExpBuilder::AddAtom(RegExpTree* term) {
|
| @@ -172,9 +171,7 @@ void RegExpBuilder::AddAssertion(RegExpTree* assert) {
|
| }
|
|
|
|
|
| -void RegExpBuilder::NewAlternative() {
|
| - FlushTerms();
|
| -}
|
| +void RegExpBuilder::NewAlternative() { FlushTerms(); }
|
|
|
|
|
| void RegExpBuilder::FlushTerms() {
|
| @@ -186,7 +183,7 @@ void RegExpBuilder::FlushTerms() {
|
| } else if (num_terms == 1) {
|
| alternative = terms_.last();
|
| } else {
|
| - alternative = new(zone()) RegExpAlternative(terms_.GetList(zone()));
|
| + alternative = new (zone()) RegExpAlternative(terms_.GetList(zone()));
|
| }
|
| alternatives_.Add(alternative, zone());
|
| terms_.Clear();
|
| @@ -199,7 +196,7 @@ RegExpTree* RegExpBuilder::ToRegExp() {
|
| int num_alternatives = alternatives_.length();
|
| if (num_alternatives == 0) return new (zone()) RegExpEmpty();
|
| if (num_alternatives == 1) return alternatives_.last();
|
| - return new(zone()) RegExpDisjunction(alternatives_.GetList(zone()));
|
| + return new (zone()) RegExpDisjunction(alternatives_.GetList(zone()));
|
| }
|
|
|
|
|
| @@ -217,11 +214,11 @@ void RegExpBuilder::AddQuantifierToAtom(
|
| int num_chars = char_vector.length();
|
| if (num_chars > 1) {
|
| Vector<const uc16> prefix = char_vector.SubVector(0, num_chars - 1);
|
| - text_.Add(new(zone()) RegExpAtom(prefix), zone());
|
| + text_.Add(new (zone()) RegExpAtom(prefix), zone());
|
| char_vector = char_vector.SubVector(num_chars - 1, num_chars);
|
| }
|
| characters_ = NULL;
|
| - atom = new(zone()) RegExpAtom(char_vector);
|
| + atom = new (zone()) RegExpAtom(char_vector);
|
| FlushText();
|
| } else if (text_.length() > 0) {
|
| DCHECK(last_added_ == ADD_ATOM);
|
| @@ -244,8 +241,8 @@ void RegExpBuilder::AddQuantifierToAtom(
|
| UNREACHABLE();
|
| return;
|
| }
|
| - terms_.Add(
|
| - new(zone()) RegExpQuantifier(min, max, quantifier_type, atom), zone());
|
| + terms_.Add(new (zone()) RegExpQuantifier(min, max, quantifier_type, atom),
|
| + zone());
|
| LAST(ADD_TERM);
|
| }
|
|
|
| @@ -286,8 +283,7 @@ bool ParseData::IsSane() {
|
| if (functions_size < 0) return false;
|
| if (functions_size % FunctionEntry::kSize != 0) return false;
|
| // Check that the total size has room for header and function entries.
|
| - int minimum_size =
|
| - PreparseDataConstants::kHeaderSize + functions_size;
|
| + int minimum_size = PreparseDataConstants::kHeaderSize + functions_size;
|
| if (data_length < minimum_size) return false;
|
| return true;
|
| }
|
| @@ -409,9 +405,7 @@ class Target BASE_EMBEDDED {
|
| *variable = this;
|
| }
|
|
|
| - ~Target() {
|
| - *variable_ = previous_;
|
| - }
|
| + ~Target() { *variable_ = previous_; }
|
|
|
| Target* previous() { return previous_; }
|
| BreakableStatement* statement() { return statement_; }
|
| @@ -430,9 +424,7 @@ class TargetScope BASE_EMBEDDED {
|
| *variable = NULL;
|
| }
|
|
|
| - ~TargetScope() {
|
| - *variable_ = previous_;
|
| - }
|
| + ~TargetScope() { *variable_ = previous_; }
|
|
|
| private:
|
| Target** variable_;
|
| @@ -454,7 +446,7 @@ class TargetScope BASE_EMBEDDED {
|
| #define DUMMY ) // to make indentation work
|
| #undef DUMMY
|
|
|
| -#define CHECK_FAILED /**/); \
|
| +#define CHECK_FAILED /**/); \
|
| if (failed_) return NULL; \
|
| ((void)0
|
| #define DUMMY ) // to make indentation work
|
| @@ -525,8 +517,7 @@ void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left,
|
| }
|
|
|
|
|
| -void ParserTraits::CheckPossibleEvalCall(Expression* expression,
|
| - Scope* scope) {
|
| +void ParserTraits::CheckPossibleEvalCall(Expression* expression, Scope* scope) {
|
| VariableProxy* callee = expression->AsVariableProxy();
|
| if (callee != NULL &&
|
| callee->raw_name() == parser_->ast_value_factory()->eval_string()) {
|
| @@ -636,13 +627,13 @@ Expression* ParserTraits::BuildUnaryExpression(Expression* expression,
|
| }
|
| // The same idea for '-foo' => 'foo*(-1)'.
|
| if (op == Token::SUB) {
|
| - return factory->NewBinaryOperation(
|
| - Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos);
|
| + return factory->NewBinaryOperation(Token::MUL, expression,
|
| + factory->NewNumberLiteral(-1, pos), pos);
|
| }
|
| // ...and one more time for '~foo' => 'foo^(~0)'.
|
| if (op == Token::BIT_NOT) {
|
| - return factory->NewBinaryOperation(
|
| - Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos);
|
| + return factory->NewBinaryOperation(Token::BIT_XOR, expression,
|
| + factory->NewNumberLiteral(~0, pos), pos);
|
| }
|
| return factory->NewUnaryOperation(op, expression, pos);
|
| }
|
| @@ -1051,7 +1042,7 @@ FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) {
|
| // Don't count the mode in the use counters--give the program a chance
|
| // to enable script/module-wide strict/strong mode below.
|
| scope_->SetLanguageMode(info->language_mode());
|
| - ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
|
| + ZoneList<Statement*>* body = new (zone()) ZoneList<Statement*>(16, zone());
|
| bool ok = true;
|
| int beg_pos = scanner()->location().beg_pos;
|
| if (info->is_module()) {
|
| @@ -1080,10 +1071,11 @@ FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) {
|
| }
|
|
|
| if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) {
|
| - if (body->length() != 1 ||
|
| - !body->at(0)->IsExpressionStatement() ||
|
| - !body->at(0)->AsExpressionStatement()->
|
| - expression()->IsFunctionLiteral()) {
|
| + if (body->length() != 1 || !body->at(0)->IsExpressionStatement() ||
|
| + !body->at(0)
|
| + ->AsExpressionStatement()
|
| + ->expression()
|
| + ->IsFunctionLiteral()) {
|
| ReportMessage(MessageTemplate::kSingleFunctionLiteral);
|
| ok = false;
|
| }
|
| @@ -1127,13 +1119,11 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info) {
|
| if (source->IsExternalTwoByteString()) {
|
| ExternalTwoByteStringUtf16CharacterStream stream(
|
| Handle<ExternalTwoByteString>::cast(source),
|
| - shared_info->start_position(),
|
| - shared_info->end_position());
|
| + shared_info->start_position(), shared_info->end_position());
|
| result = ParseLazy(isolate, info, &stream);
|
| } else {
|
| - GenericStringUtf16CharacterStream stream(source,
|
| - shared_info->start_position(),
|
| - shared_info->end_position());
|
| + GenericStringUtf16CharacterStream stream(
|
| + source, shared_info->start_position(), shared_info->end_position());
|
| result = ParseLazy(isolate, info, &stream);
|
| }
|
|
|
| @@ -1183,11 +1173,12 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info,
|
| DCHECK(is_sloppy(scope->language_mode()) ||
|
| is_strict(info->language_mode()));
|
| DCHECK(info->language_mode() == shared_info->language_mode());
|
| - FunctionLiteral::FunctionType function_type = shared_info->is_expression()
|
| - ? (shared_info->is_anonymous()
|
| - ? FunctionLiteral::ANONYMOUS_EXPRESSION
|
| - : FunctionLiteral::NAMED_EXPRESSION)
|
| - : FunctionLiteral::DECLARATION;
|
| + FunctionLiteral::FunctionType function_type =
|
| + shared_info->is_expression()
|
| + ? (shared_info->is_anonymous()
|
| + ? FunctionLiteral::ANONYMOUS_EXPRESSION
|
| + : FunctionLiteral::NAMED_EXPRESSION)
|
| + : FunctionLiteral::DECLARATION;
|
| bool ok = true;
|
|
|
| if (shared_info->is_arrow()) {
|
| @@ -1278,7 +1269,7 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
|
| TargetScope scope(&this->target_stack_);
|
|
|
| DCHECK(body != NULL);
|
| - bool directive_prologue = true; // Parsing directive prologue.
|
| + bool directive_prologue = true; // Parsing directive prologue.
|
|
|
| while (peek() != end_token) {
|
| if (directive_prologue && peek() != Token::STRING) {
|
| @@ -1309,7 +1300,7 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
|
| }
|
|
|
| if (stat == NULL || stat->IsEmpty()) {
|
| - directive_prologue = false; // End of directive prologue.
|
| + directive_prologue = false; // End of directive prologue.
|
| continue;
|
| }
|
|
|
| @@ -2238,8 +2229,8 @@ Statement* Parser::ParseFunctionDeclaration(
|
| int pos = position();
|
| bool is_generator = Check(Token::MUL);
|
| bool is_strict_reserved = false;
|
| - const AstRawString* name = ParseIdentifierOrStrictReservedWord(
|
| - &is_strict_reserved, CHECK_OK);
|
| + const AstRawString* name =
|
| + ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
|
|
|
| if (fni_ != NULL) {
|
| fni_->Enter();
|
| @@ -2356,14 +2347,14 @@ Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
|
| // '{' StatementList '}'
|
|
|
| // Construct block expecting 16 statements.
|
| - Block* body =
|
| - factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
|
| + Block* body = factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
|
| Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
|
|
|
| // Parse the statements and collect escaping labels.
|
| Expect(Token::LBRACE, CHECK_OK);
|
| block_scope->set_start_position(scanner()->location().beg_pos);
|
| - { BlockState block_state(&scope_, block_scope);
|
| + {
|
| + BlockState block_state(&scope_, block_scope);
|
| Target target(&this->target_stack_, body);
|
|
|
| while (peek() != Token::RBRACE) {
|
| @@ -2592,7 +2583,7 @@ static bool ContainsLabel(ZoneList<const AstRawString*>* labels,
|
| const AstRawString* label) {
|
| DCHECK(label != NULL);
|
| if (labels != NULL) {
|
| - for (int i = labels->length(); i-- > 0; ) {
|
| + for (int i = labels->length(); i-- > 0;) {
|
| if (labels->at(i) == label) {
|
| return true;
|
| }
|
| @@ -2624,7 +2615,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
|
|
|
| case Token::THIS:
|
| if (!FLAG_strong_this) break;
|
| - // Fall through.
|
| + // Fall through.
|
| case Token::SUPER:
|
| if (is_strong(language_mode()) &&
|
| IsClassConstructor(function_state_->kind())) {
|
| @@ -2665,8 +2656,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
|
| bool starts_with_idenfifier = peek_any_identifier();
|
| Expression* expr = ParseExpression(true, CHECK_OK);
|
| if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL &&
|
| - expr->AsVariableProxy() != NULL &&
|
| - !expr->AsVariableProxy()->is_this()) {
|
| + expr->AsVariableProxy() != NULL && !expr->AsVariableProxy()->is_this()) {
|
| // Expression is a single identifier, and not, e.g., a parenthesized
|
| // identifier.
|
| VariableProxy* var = expr->AsVariableProxy();
|
| @@ -2682,7 +2672,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
|
| return NULL;
|
| }
|
| if (labels == NULL) {
|
| - labels = new(zone()) ZoneList<const AstRawString*>(4, zone());
|
| + labels = new (zone()) ZoneList<const AstRawString*>(4, zone());
|
| }
|
| labels->Add(label, zone());
|
| // Remove the "ghost" variable that turned out to be a label
|
| @@ -2738,8 +2728,8 @@ IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels,
|
| } else {
|
| else_statement = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
|
| }
|
| - return factory()->NewIfStatement(
|
| - condition, then_statement, else_statement, pos);
|
| + return factory()->NewIfStatement(condition, then_statement, else_statement,
|
| + pos);
|
| }
|
|
|
|
|
| @@ -2751,8 +2741,8 @@ Statement* Parser::ParseContinueStatement(bool* ok) {
|
| Expect(Token::CONTINUE, CHECK_OK);
|
| const AstRawString* label = NULL;
|
| Token::Value tok = peek();
|
| - if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
|
| - tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) {
|
| + if (!scanner()->HasAnyLineTerminatorBeforeNext() && tok != Token::SEMICOLON &&
|
| + tok != Token::RBRACE && tok != Token::EOS) {
|
| // ECMA allows "eval" or "arguments" as labels even in strict mode.
|
| label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
|
| }
|
| @@ -2781,8 +2771,8 @@ Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels,
|
| Expect(Token::BREAK, CHECK_OK);
|
| const AstRawString* label = NULL;
|
| Token::Value tok = peek();
|
| - if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
|
| - tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) {
|
| + if (!scanner()->HasAnyLineTerminatorBeforeNext() && tok != Token::SEMICOLON &&
|
| + tok != Token::RBRACE && tok != Token::EOS) {
|
| // ECMA allows "eval" or "arguments" as labels even in strict mode.
|
| label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
|
| }
|
| @@ -2823,10 +2813,8 @@ Statement* Parser::ParseReturnStatement(bool* ok) {
|
| Token::Value tok = peek();
|
| Statement* result;
|
| Expression* return_value;
|
| - if (scanner()->HasAnyLineTerminatorBeforeNext() ||
|
| - tok == Token::SEMICOLON ||
|
| - tok == Token::RBRACE ||
|
| - tok == Token::EOS) {
|
| + if (scanner()->HasAnyLineTerminatorBeforeNext() || tok == Token::SEMICOLON ||
|
| + tok == Token::RBRACE || tok == Token::EOS) {
|
| if (IsSubclassConstructor(function_state_->kind())) {
|
| return_value = ThisExpression(scope_, factory(), loc.beg_pos);
|
| } else {
|
| @@ -2855,8 +2843,8 @@ Statement* Parser::ParseReturnStatement(bool* ok) {
|
| //
|
| // return (temp = expr) === undefined ? this :
|
| // %_IsSpecObject(temp) ? temp : throw new TypeError(...);
|
| - Variable* temp = scope_->NewTemporary(
|
| - ast_value_factory()->empty_string());
|
| + Variable* temp =
|
| + scope_->NewTemporary(ast_value_factory()->empty_string());
|
| Assignment* assign = factory()->NewAssignment(
|
| Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos);
|
|
|
| @@ -2892,8 +2880,8 @@ Statement* Parser::ParseReturnStatement(bool* ok) {
|
| if (is_generator()) {
|
| Expression* generator = factory()->NewVariableProxy(
|
| function_state_->generator_object_variable());
|
| - Expression* yield = factory()->NewYield(
|
| - generator, return_value, Yield::kFinal, loc.beg_pos);
|
| + Expression* yield = factory()->NewYield(generator, return_value,
|
| + Yield::kFinal, loc.beg_pos);
|
| result = factory()->NewExpressionStatement(yield, loc.beg_pos);
|
| } else {
|
| result = factory()->NewReturnStatement(return_value, loc.beg_pos);
|
| @@ -2930,7 +2918,8 @@ Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels,
|
| scope_->DeclarationScope()->RecordWithStatement();
|
| Scope* with_scope = NewScope(scope_, WITH_SCOPE);
|
| Block* body;
|
| - { BlockState block_state(&scope_, with_scope);
|
| + {
|
| + BlockState block_state(&scope_, with_scope);
|
| with_scope->set_start_position(scanner()->peek_location().beg_pos);
|
|
|
| // The body of the with statement must be enclosed in an additional
|
| @@ -2975,10 +2964,9 @@ CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) {
|
| Expect(Token::COLON, CHECK_OK);
|
| int pos = position();
|
| ZoneList<Statement*>* statements =
|
| - new(zone()) ZoneList<Statement*>(5, zone());
|
| + new (zone()) ZoneList<Statement*>(5, zone());
|
| Statement* stat = NULL;
|
| - while (peek() != Token::CASE &&
|
| - peek() != Token::DEFAULT &&
|
| + while (peek() != Token::CASE && peek() != Token::DEFAULT &&
|
| peek() != Token::RBRACE) {
|
| stat = ParseStatementListItem(CHECK_OK);
|
| statements->Add(stat, zone());
|
| @@ -3087,8 +3075,8 @@ Statement* Parser::ParseThrowStatement(bool* ok) {
|
| Expression* exception = ParseExpression(true, CHECK_OK);
|
| ExpectSemicolon(CHECK_OK);
|
|
|
| - return factory()->NewExpressionStatement(
|
| - factory()->NewThrow(exception, pos), pos);
|
| + return factory()->NewExpressionStatement(factory()->NewThrow(exception, pos),
|
| + pos);
|
| }
|
|
|
|
|
| @@ -3320,16 +3308,15 @@ Expression* Parser::BuildIteratorNextResult(Expression* iterator,
|
|
|
|
|
| void Parser::InitializeForEachStatement(ForEachStatement* stmt,
|
| - Expression* each,
|
| - Expression* subject,
|
| + Expression* each, Expression* subject,
|
| Statement* body) {
|
| ForOfStatement* for_of = stmt->AsForOfStatement();
|
|
|
| if (for_of != NULL) {
|
| - Variable* iterator = scope_->NewTemporary(
|
| - ast_value_factory()->dot_iterator_string());
|
| - Variable* result = scope_->NewTemporary(
|
| - ast_value_factory()->dot_result_string());
|
| + Variable* iterator =
|
| + scope_->NewTemporary(ast_value_factory()->dot_iterator_string());
|
| + Variable* result =
|
| + scope_->NewTemporary(ast_value_factory()->dot_result_string());
|
|
|
| Expression* assign_iterator;
|
| Expression* next_result;
|
| @@ -3355,8 +3342,8 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt,
|
| Expression* done_literal = factory()->NewStringLiteral(
|
| ast_value_factory()->done_string(), RelocInfo::kNoPosition);
|
| Expression* result_proxy = factory()->NewVariableProxy(result);
|
| - result_done = factory()->NewProperty(
|
| - result_proxy, done_literal, RelocInfo::kNoPosition);
|
| + result_done = factory()->NewProperty(result_proxy, done_literal,
|
| + RelocInfo::kNoPosition);
|
| }
|
|
|
| // each = result.value
|
| @@ -3370,11 +3357,8 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt,
|
| RelocInfo::kNoPosition);
|
| }
|
|
|
| - for_of->Initialize(each, subject, body,
|
| - assign_iterator,
|
| - next_result,
|
| - result_done,
|
| - assign_each);
|
| + for_of->Initialize(each, subject, body, assign_iterator, next_result,
|
| + result_done, assign_each);
|
| } else {
|
| stmt->Initialize(each, subject, body);
|
| }
|
| @@ -3442,8 +3426,8 @@ Statement* Parser::DesugarLexicalBindingsInForStatement(
|
| VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
|
| Assignment* assignment = factory()->NewAssignment(
|
| Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition);
|
| - Statement* assignment_statement = factory()->NewExpressionStatement(
|
| - assignment, RelocInfo::kNoPosition);
|
| + Statement* assignment_statement =
|
| + factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
|
| outer_block->statements()->Add(assignment_statement, zone());
|
| temps.Add(temp, zone());
|
| }
|
| @@ -3722,8 +3706,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| // let x; // for TDZ
|
| // }
|
|
|
| - Variable* temp = scope_->NewTemporary(
|
| - ast_value_factory()->dot_for_string());
|
| + Variable* temp =
|
| + scope_->NewTemporary(ast_value_factory()->dot_for_string());
|
| ForEachStatement* loop =
|
| factory()->NewForEachStatement(mode, labels, stmt_pos);
|
| Target target(&this->target_stack_, loop);
|
| @@ -3904,9 +3888,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| Statement* result = NULL;
|
| if (lexical_bindings.length() > 0) {
|
| scope_ = for_scope;
|
| - result = DesugarLexicalBindingsInForStatement(
|
| - inner_scope, is_const, &lexical_bindings, loop, init, cond,
|
| - next, body, CHECK_OK);
|
| + result = DesugarLexicalBindingsInForStatement(inner_scope, is_const,
|
| + &lexical_bindings, loop, init,
|
| + cond, next, body, CHECK_OK);
|
| scope_ = saved_scope;
|
| for_scope->set_end_position(scanner()->location().end_pos);
|
| } else {
|
| @@ -4105,8 +4089,8 @@ DoExpression* Parser::ParseDoExpression(bool* ok) {
|
|
|
| void ParserTraits::ParseArrowFunctionFormalParameterList(
|
| ParserFormalParameters* parameters, Expression* expr,
|
| - const Scanner::Location& params_loc,
|
| - Scanner::Location* duplicate_loc, bool* ok) {
|
| + const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
|
| + bool* ok) {
|
| if (expr->IsEmptyParentheses()) return;
|
|
|
| ParseArrowFunctionFormalParameters(parameters, expr, params_loc, ok);
|
| @@ -4161,8 +4145,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| // Setter ::
|
| // '(' PropertySetParameterList ')' '{' FunctionBody '}'
|
|
|
| - int pos = function_token_pos == RelocInfo::kNoPosition
|
| - ? peek_position() : function_token_pos;
|
| + int pos = function_token_pos == RelocInfo::kNoPosition ? peek_position()
|
| + : function_token_pos;
|
|
|
| bool is_generator = IsGeneratorFunction(kind);
|
|
|
| @@ -4253,9 +4237,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| Expect(Token::RPAREN, CHECK_OK);
|
| int formals_end_position = scanner()->location().end_pos;
|
|
|
| - CheckArityRestrictions(arity, arity_restriction,
|
| - formals.has_rest, start_position,
|
| - formals_end_position, CHECK_OK);
|
| + CheckArityRestrictions(arity, arity_restriction, formals.has_rest,
|
| + start_position, formals_end_position, CHECK_OK);
|
| Expect(Token::LBRACE, CHECK_OK);
|
|
|
| // Determine if the function can be parsed lazily. Lazy parsing is different
|
| @@ -4562,9 +4545,9 @@ Block* Parser::BuildParameterInitializationBlock(
|
| factory()->NewVariableProxy(parameters.scope->parameter(i)),
|
| factory()->NewUndefinedLiteral(RelocInfo::kNoPosition),
|
| RelocInfo::kNoPosition);
|
| - initial_value = factory()->NewConditional(
|
| - condition, parameter.initializer, initial_value,
|
| - RelocInfo::kNoPosition);
|
| + initial_value =
|
| + factory()->NewConditional(condition, parameter.initializer,
|
| + initial_value, RelocInfo::kNoPosition);
|
| descriptor.initialization_pos = parameter.initializer->position();
|
| initializer_position = parameter.initializer_end_position;
|
| } else if (parameter.is_rest) {
|
| @@ -4683,7 +4666,7 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
|
| // Everything inside an eagerly parsed function will be parsed eagerly
|
| // (see comment above).
|
| ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
|
| - ZoneList<Statement*>* result = new(zone()) ZoneList<Statement*>(8, zone());
|
| + ZoneList<Statement*>* result = new (zone()) ZoneList<Statement*>(8, zone());
|
|
|
| static const int kFunctionNameAssignmentIndex = 0;
|
| if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
|
| @@ -4715,7 +4698,7 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
|
| // For generators, allocate and yield an iterator on function entry.
|
| if (IsGeneratorFunction(kind)) {
|
| ZoneList<Expression*>* arguments =
|
| - new(zone()) ZoneList<Expression*>(0, zone());
|
| + new (zone()) ZoneList<Expression*>(0, zone());
|
| CallRuntime* allocation = factory()->NewCallRuntime(
|
| Runtime::kCreateJSGeneratorObject, arguments, pos);
|
| VariableProxy* init_proxy = factory()->NewVariableProxy(
|
| @@ -4724,10 +4707,11 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
|
| Token::INIT, init_proxy, allocation, RelocInfo::kNoPosition);
|
| VariableProxy* get_proxy = factory()->NewVariableProxy(
|
| function_state_->generator_object_variable());
|
| - Yield* yield = factory()->NewYield(
|
| - get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition);
|
| - body->Add(factory()->NewExpressionStatement(
|
| - yield, RelocInfo::kNoPosition), zone());
|
| + Yield* yield = factory()->NewYield(get_proxy, assignment, Yield::kInitial,
|
| + RelocInfo::kNoPosition);
|
| + body->Add(
|
| + factory()->NewExpressionStatement(yield, RelocInfo::kNoPosition),
|
| + zone());
|
| }
|
|
|
| ParseStatementList(body, Token::RBRACE, CHECK_OK);
|
| @@ -4739,8 +4723,9 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
|
| factory()->NewUndefinedLiteral(RelocInfo::kNoPosition);
|
| Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal,
|
| RelocInfo::kNoPosition);
|
| - body->Add(factory()->NewExpressionStatement(
|
| - yield, RelocInfo::kNoPosition), zone());
|
| + body->Add(
|
| + factory()->NewExpressionStatement(yield, RelocInfo::kNoPosition),
|
| + zone());
|
| }
|
|
|
| if (IsSubclassConstructor(kind)) {
|
| @@ -4748,7 +4733,7 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
|
| factory()->NewReturnStatement(
|
| this->ThisExpression(scope_, factory(), RelocInfo::kNoPosition),
|
| RelocInfo::kNoPosition),
|
| - zone());
|
| + zone());
|
| }
|
| }
|
|
|
| @@ -4946,8 +4931,8 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) {
|
| int pos = peek_position();
|
| Expect(Token::MOD, CHECK_OK);
|
| // Allow "eval" or "arguments" for backward compatibility.
|
| - const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers,
|
| - CHECK_OK);
|
| + const AstRawString* name =
|
| + ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
|
| Scanner::Location spread_pos;
|
| ExpressionClassifier classifier;
|
| ZoneList<Expression*>* args =
|
| @@ -5017,9 +5002,10 @@ void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
|
| // In ES6, conflicting variable bindings are early errors.
|
| const AstRawString* name = decl->proxy()->raw_name();
|
| int position = decl->proxy()->position();
|
| - Scanner::Location location = position == RelocInfo::kNoPosition
|
| - ? Scanner::Location::invalid()
|
| - : Scanner::Location(position, position + 1);
|
| + Scanner::Location location =
|
| + position == RelocInfo::kNoPosition
|
| + ? Scanner::Location::invalid()
|
| + : Scanner::Location(position, position + 1);
|
| ParserTraits::ReportMessageAt(location, MessageTemplate::kVarRedeclaration,
|
| name);
|
| *ok = false;
|
| @@ -5043,10 +5029,10 @@ void Parser::InsertShadowingVarBindingInitializers(Block* inner_block) {
|
| if (parameter == nullptr) continue;
|
| VariableProxy* to = inner_scope->NewUnresolved(factory(), name);
|
| VariableProxy* from = factory()->NewVariableProxy(parameter);
|
| - Expression* assignment = factory()->NewAssignment(
|
| - Token::ASSIGN, to, from, RelocInfo::kNoPosition);
|
| - Statement* statement = factory()->NewExpressionStatement(
|
| - assignment, RelocInfo::kNoPosition);
|
| + Expression* assignment = factory()->NewAssignment(Token::ASSIGN, to, from,
|
| + RelocInfo::kNoPosition);
|
| + Statement* statement =
|
| + factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
|
| inner_block->statements()->InsertAt(0, statement, zone());
|
| }
|
| }
|
| @@ -5237,9 +5223,7 @@ void RegExpParser::Advance(int dist) {
|
| }
|
|
|
|
|
| -bool RegExpParser::simple() {
|
| - return simple_;
|
| -}
|
| +bool RegExpParser::simple() { return simple_; }
|
|
|
|
|
| bool RegExpParser::IsSyntaxCharacter(uc32 c) {
|
| @@ -5292,342 +5276,357 @@ RegExpTree* RegExpParser::ParseDisjunction() {
|
| RegExpBuilder* builder = initial_state.builder();
|
| while (true) {
|
| switch (current()) {
|
| - case kEndMarker:
|
| - if (state->IsSubexpression()) {
|
| - // Inside a parenthesized group when hitting end of input.
|
| - ReportError(CStrVector("Unterminated group") CHECK_FAILED);
|
| - }
|
| - DCHECK_EQ(INITIAL, state->group_type());
|
| - // Parsing completed successfully.
|
| - return builder->ToRegExp();
|
| - case ')': {
|
| - if (!state->IsSubexpression()) {
|
| - ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
|
| - }
|
| - DCHECK_NE(INITIAL, state->group_type());
|
| + case kEndMarker:
|
| + if (state->IsSubexpression()) {
|
| + // Inside a parenthesized group when hitting end of input.
|
| + ReportError(CStrVector("Unterminated group") CHECK_FAILED);
|
| + }
|
| + DCHECK_EQ(INITIAL, state->group_type());
|
| + // Parsing completed successfully.
|
| + return builder->ToRegExp();
|
| + case ')': {
|
| + if (!state->IsSubexpression()) {
|
| + ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
|
| + }
|
| + DCHECK_NE(INITIAL, state->group_type());
|
|
|
| - Advance();
|
| - // End disjunction parsing and convert builder content to new single
|
| - // regexp atom.
|
| - RegExpTree* body = builder->ToRegExp();
|
| -
|
| - int end_capture_index = captures_started();
|
| -
|
| - int capture_index = state->capture_index();
|
| - SubexpressionType group_type = state->group_type();
|
| -
|
| - // Build result of subexpression.
|
| - if (group_type == CAPTURE) {
|
| - RegExpCapture* capture = GetCapture(capture_index);
|
| - capture->set_body(body);
|
| - body = capture;
|
| - } else if (group_type != GROUPING) {
|
| - DCHECK(group_type == POSITIVE_LOOKAROUND ||
|
| - group_type == NEGATIVE_LOOKAROUND);
|
| - bool is_positive = (group_type == POSITIVE_LOOKAROUND);
|
| - body = new (zone()) RegExpLookaround(
|
| - body, is_positive, end_capture_index - capture_index, capture_index,
|
| - state->lookaround_type());
|
| - }
|
| + Advance();
|
| + // End disjunction parsing and convert builder content to new single
|
| + // regexp atom.
|
| + RegExpTree* body = builder->ToRegExp();
|
| +
|
| + int end_capture_index = captures_started();
|
| +
|
| + int capture_index = state->capture_index();
|
| + SubexpressionType group_type = state->group_type();
|
| +
|
| + // Build result of subexpression.
|
| + if (group_type == CAPTURE) {
|
| + RegExpCapture* capture = GetCapture(capture_index);
|
| + capture->set_body(body);
|
| + body = capture;
|
| + } else if (group_type != GROUPING) {
|
| + DCHECK(group_type == POSITIVE_LOOKAROUND ||
|
| + group_type == NEGATIVE_LOOKAROUND);
|
| + bool is_positive = (group_type == POSITIVE_LOOKAROUND);
|
| + body = new (zone()) RegExpLookaround(
|
| + body, is_positive, end_capture_index - capture_index,
|
| + capture_index, state->lookaround_type());
|
| + }
|
|
|
| - // Restore previous state.
|
| - state = state->previous_state();
|
| - builder = state->builder();
|
| + // Restore previous state.
|
| + state = state->previous_state();
|
| + builder = state->builder();
|
|
|
| - builder->AddAtom(body);
|
| - // For compatability with JSC and ES3, we allow quantifiers after
|
| - // lookaheads, and break in all cases.
|
| - break;
|
| - }
|
| - case '|': {
|
| - Advance();
|
| - builder->NewAlternative();
|
| - continue;
|
| - }
|
| - case '*':
|
| - case '+':
|
| - case '?':
|
| - return ReportError(CStrVector("Nothing to repeat"));
|
| - case '^': {
|
| - Advance();
|
| - if (multiline_) {
|
| - builder->AddAssertion(
|
| - new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE));
|
| - } else {
|
| - builder->AddAssertion(
|
| - new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
|
| - set_contains_anchor();
|
| + builder->AddAtom(body);
|
| + // For compatability with JSC and ES3, we allow quantifiers after
|
| + // lookaheads, and break in all cases.
|
| + break;
|
| }
|
| - continue;
|
| - }
|
| - case '$': {
|
| - Advance();
|
| - RegExpAssertion::AssertionType assertion_type =
|
| - multiline_ ? RegExpAssertion::END_OF_LINE :
|
| - RegExpAssertion::END_OF_INPUT;
|
| - builder->AddAssertion(new(zone()) RegExpAssertion(assertion_type));
|
| - continue;
|
| - }
|
| - case '.': {
|
| - Advance();
|
| - // everything except \x0a, \x0d, \u2028 and \u2029
|
| - ZoneList<CharacterRange>* ranges =
|
| - new(zone()) ZoneList<CharacterRange>(2, zone());
|
| - CharacterRange::AddClassEscape('.', ranges, zone());
|
| - RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
|
| - builder->AddAtom(atom);
|
| - break;
|
| - }
|
| - case '(': {
|
| - SubexpressionType subexpr_type = CAPTURE;
|
| - RegExpLookaround::Type lookaround_type = state->lookaround_type();
|
| - Advance();
|
| - if (current() == '?') {
|
| - switch (Next()) {
|
| - case ':':
|
| - subexpr_type = GROUPING;
|
| - break;
|
| - case '=':
|
| - lookaround_type = RegExpLookaround::LOOKAHEAD;
|
| - subexpr_type = POSITIVE_LOOKAROUND;
|
| - break;
|
| - case '!':
|
| - lookaround_type = RegExpLookaround::LOOKAHEAD;
|
| - subexpr_type = NEGATIVE_LOOKAROUND;
|
| - break;
|
| - case '<':
|
| - if (FLAG_harmony_regexp_lookbehind) {
|
| - Advance();
|
| - lookaround_type = RegExpLookaround::LOOKBEHIND;
|
| - if (Next() == '=') {
|
| - subexpr_type = POSITIVE_LOOKAROUND;
|
| - break;
|
| - } else if (Next() == '!') {
|
| - subexpr_type = NEGATIVE_LOOKAROUND;
|
| - break;
|
| - }
|
| - }
|
| - // Fall through.
|
| - default:
|
| - ReportError(CStrVector("Invalid group") CHECK_FAILED);
|
| - break;
|
| - }
|
| - Advance(2);
|
| - } else {
|
| - if (captures_started_ >= kMaxCaptures) {
|
| - ReportError(CStrVector("Too many captures") CHECK_FAILED);
|
| - }
|
| - captures_started_++;
|
| + case '|': {
|
| + Advance();
|
| + builder->NewAlternative();
|
| + continue;
|
| }
|
| - // Store current state and begin new disjunction parsing.
|
| - state = new (zone()) RegExpParserState(
|
| - state, subexpr_type, lookaround_type, captures_started_, zone());
|
| - builder = state->builder();
|
| - continue;
|
| - }
|
| - case '[': {
|
| - RegExpTree* atom = ParseCharacterClass(CHECK_FAILED);
|
| - builder->AddAtom(atom);
|
| - break;
|
| - }
|
| - // Atom ::
|
| - // \ AtomEscape
|
| - case '\\':
|
| - switch (Next()) {
|
| - case kEndMarker:
|
| - return ReportError(CStrVector("\\ at end of pattern"));
|
| - case 'b':
|
| - Advance(2);
|
| - builder->AddAssertion(
|
| - new(zone()) RegExpAssertion(RegExpAssertion::BOUNDARY));
|
| + case '*':
|
| + case '+':
|
| + case '?':
|
| + return ReportError(CStrVector("Nothing to repeat"));
|
| + case '^': {
|
| + Advance();
|
| + if (multiline_) {
|
| + builder->AddAssertion(
|
| + new (zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE));
|
| + } else {
|
| + builder->AddAssertion(
|
| + new (zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
|
| + set_contains_anchor();
|
| + }
|
| continue;
|
| - case 'B':
|
| - Advance(2);
|
| - builder->AddAssertion(
|
| - new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY));
|
| + }
|
| + case '$': {
|
| + Advance();
|
| + RegExpAssertion::AssertionType assertion_type =
|
| + multiline_ ? RegExpAssertion::END_OF_LINE
|
| + : RegExpAssertion::END_OF_INPUT;
|
| + builder->AddAssertion(new (zone()) RegExpAssertion(assertion_type));
|
| continue;
|
| - // AtomEscape ::
|
| - // CharacterClassEscape
|
| - //
|
| - // CharacterClassEscape :: one of
|
| - // d D s S w W
|
| - case 'd': case 'D': case 's': case 'S': case 'w': case 'W': {
|
| - uc32 c = Next();
|
| - Advance(2);
|
| + }
|
| + case '.': {
|
| + Advance();
|
| + // everything except \x0a, \x0d, \u2028 and \u2029
|
| ZoneList<CharacterRange>* ranges =
|
| - new(zone()) ZoneList<CharacterRange>(2, zone());
|
| - CharacterRange::AddClassEscape(c, ranges, zone());
|
| - RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
|
| + new (zone()) ZoneList<CharacterRange>(2, zone());
|
| + CharacterRange::AddClassEscape('.', ranges, zone());
|
| + RegExpTree* atom = new (zone()) RegExpCharacterClass(ranges, false);
|
| builder->AddAtom(atom);
|
| break;
|
| }
|
| - case '1': case '2': case '3': case '4': case '5': case '6':
|
| - case '7': case '8': case '9': {
|
| - int index = 0;
|
| - if (ParseBackReferenceIndex(&index)) {
|
| - if (state->IsInsideCaptureGroup(index)) {
|
| - // The backreference is inside the capture group it refers to.
|
| - // Nothing can possibly have been captured yet.
|
| - builder->AddEmpty();
|
| - } else {
|
| - RegExpCapture* capture = GetCapture(index);
|
| - RegExpTree* atom = new (zone()) RegExpBackReference(capture);
|
| - builder->AddAtom(atom);
|
| + case '(': {
|
| + SubexpressionType subexpr_type = CAPTURE;
|
| + RegExpLookaround::Type lookaround_type = state->lookaround_type();
|
| + Advance();
|
| + if (current() == '?') {
|
| + switch (Next()) {
|
| + case ':':
|
| + subexpr_type = GROUPING;
|
| + break;
|
| + case '=':
|
| + lookaround_type = RegExpLookaround::LOOKAHEAD;
|
| + subexpr_type = POSITIVE_LOOKAROUND;
|
| + break;
|
| + case '!':
|
| + lookaround_type = RegExpLookaround::LOOKAHEAD;
|
| + subexpr_type = NEGATIVE_LOOKAROUND;
|
| + break;
|
| + case '<':
|
| + if (FLAG_harmony_regexp_lookbehind) {
|
| + Advance();
|
| + lookaround_type = RegExpLookaround::LOOKBEHIND;
|
| + if (Next() == '=') {
|
| + subexpr_type = POSITIVE_LOOKAROUND;
|
| + break;
|
| + } else if (Next() == '!') {
|
| + subexpr_type = NEGATIVE_LOOKAROUND;
|
| + break;
|
| + }
|
| + }
|
| + // Fall through.
|
| + default:
|
| + ReportError(CStrVector("Invalid group") CHECK_FAILED);
|
| + break;
|
| }
|
| - break;
|
| - }
|
| - uc32 first_digit = Next();
|
| - if (first_digit == '8' || first_digit == '9') {
|
| - // If the 'u' flag is present, only syntax characters can be escaped,
|
| - // no other identity escapes are allowed. If the 'u' flag is not
|
| - // present, all identity escapes are allowed.
|
| - if (!FLAG_harmony_unicode_regexps || !unicode_) {
|
| - builder->AddCharacter(first_digit);
|
| - Advance(2);
|
| - } else {
|
| - return ReportError(CStrVector("Invalid escape"));
|
| + Advance(2);
|
| + } else {
|
| + if (captures_started_ >= kMaxCaptures) {
|
| + ReportError(CStrVector("Too many captures") CHECK_FAILED);
|
| }
|
| - break;
|
| + captures_started_++;
|
| }
|
| + // Store current state and begin new disjunction parsing.
|
| + state = new (zone()) RegExpParserState(
|
| + state, subexpr_type, lookaround_type, captures_started_, zone());
|
| + builder = state->builder();
|
| + continue;
|
| }
|
| - // FALLTHROUGH
|
| - case '0': {
|
| - Advance();
|
| - uc32 octal = ParseOctalLiteral();
|
| - builder->AddCharacter(octal);
|
| - break;
|
| - }
|
| - // ControlEscape :: one of
|
| - // f n r t v
|
| - case 'f':
|
| - Advance(2);
|
| - builder->AddCharacter('\f');
|
| - break;
|
| - case 'n':
|
| - Advance(2);
|
| - builder->AddCharacter('\n');
|
| - break;
|
| - case 'r':
|
| - Advance(2);
|
| - builder->AddCharacter('\r');
|
| - break;
|
| - case 't':
|
| - Advance(2);
|
| - builder->AddCharacter('\t');
|
| - break;
|
| - case 'v':
|
| - Advance(2);
|
| - builder->AddCharacter('\v');
|
| - break;
|
| - case 'c': {
|
| - Advance();
|
| - uc32 controlLetter = Next();
|
| - // Special case if it is an ASCII letter.
|
| - // Convert lower case letters to uppercase.
|
| - uc32 letter = controlLetter & ~('a' ^ 'A');
|
| - if (letter < 'A' || 'Z' < letter) {
|
| - // controlLetter is not in range 'A'-'Z' or 'a'-'z'.
|
| - // This is outside the specification. We match JSC in
|
| - // reading the backslash as a literal character instead
|
| - // of as starting an escape.
|
| - builder->AddCharacter('\\');
|
| - } else {
|
| - Advance(2);
|
| - builder->AddCharacter(controlLetter & 0x1f);
|
| - }
|
| + case '[': {
|
| + RegExpTree* atom = ParseCharacterClass(CHECK_FAILED);
|
| + builder->AddAtom(atom);
|
| break;
|
| }
|
| - case 'x': {
|
| - Advance(2);
|
| - uc32 value;
|
| - if (ParseHexEscape(2, &value)) {
|
| - builder->AddCharacter(value);
|
| - } else if (!FLAG_harmony_unicode_regexps || !unicode_) {
|
| - builder->AddCharacter('x');
|
| - } else {
|
| - // If the 'u' flag is present, invalid escapes are not treated as
|
| - // identity escapes.
|
| - return ReportError(CStrVector("Invalid escape"));
|
| + // Atom ::
|
| + // \ AtomEscape
|
| + case '\\':
|
| + switch (Next()) {
|
| + case kEndMarker:
|
| + return ReportError(CStrVector("\\ at end of pattern"));
|
| + case 'b':
|
| + Advance(2);
|
| + builder->AddAssertion(
|
| + new (zone()) RegExpAssertion(RegExpAssertion::BOUNDARY));
|
| + continue;
|
| + case 'B':
|
| + Advance(2);
|
| + builder->AddAssertion(
|
| + new (zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY));
|
| + continue;
|
| + // AtomEscape ::
|
| + // CharacterClassEscape
|
| + //
|
| + // CharacterClassEscape :: one of
|
| + // d D s S w W
|
| + case 'd':
|
| + case 'D':
|
| + case 's':
|
| + case 'S':
|
| + case 'w':
|
| + case 'W': {
|
| + uc32 c = Next();
|
| + Advance(2);
|
| + ZoneList<CharacterRange>* ranges =
|
| + new (zone()) ZoneList<CharacterRange>(2, zone());
|
| + CharacterRange::AddClassEscape(c, ranges, zone());
|
| + RegExpTree* atom = new (zone()) RegExpCharacterClass(ranges, false);
|
| + builder->AddAtom(atom);
|
| + break;
|
| + }
|
| + case '1':
|
| + case '2':
|
| + case '3':
|
| + case '4':
|
| + case '5':
|
| + case '6':
|
| + case '7':
|
| + case '8':
|
| + case '9': {
|
| + int index = 0;
|
| + if (ParseBackReferenceIndex(&index)) {
|
| + if (state->IsInsideCaptureGroup(index)) {
|
| + // The backreference is inside the capture group it refers to.
|
| + // Nothing can possibly have been captured yet.
|
| + builder->AddEmpty();
|
| + } else {
|
| + RegExpCapture* capture = GetCapture(index);
|
| + RegExpTree* atom = new (zone()) RegExpBackReference(capture);
|
| + builder->AddAtom(atom);
|
| + }
|
| + break;
|
| + }
|
| + uc32 first_digit = Next();
|
| + if (first_digit == '8' || first_digit == '9') {
|
| + // If the 'u' flag is present, only syntax characters can be
|
| + // escaped,
|
| + // no other identity escapes are allowed. If the 'u' flag is not
|
| + // present, all identity escapes are allowed.
|
| + if (!FLAG_harmony_unicode_regexps || !unicode_) {
|
| + builder->AddCharacter(first_digit);
|
| + Advance(2);
|
| + } else {
|
| + return ReportError(CStrVector("Invalid escape"));
|
| + }
|
| + break;
|
| + }
|
| + }
|
| + // FALLTHROUGH
|
| + case '0': {
|
| + Advance();
|
| + uc32 octal = ParseOctalLiteral();
|
| + builder->AddCharacter(octal);
|
| + break;
|
| + }
|
| + // ControlEscape :: one of
|
| + // f n r t v
|
| + case 'f':
|
| + Advance(2);
|
| + builder->AddCharacter('\f');
|
| + break;
|
| + case 'n':
|
| + Advance(2);
|
| + builder->AddCharacter('\n');
|
| + break;
|
| + case 'r':
|
| + Advance(2);
|
| + builder->AddCharacter('\r');
|
| + break;
|
| + case 't':
|
| + Advance(2);
|
| + builder->AddCharacter('\t');
|
| + break;
|
| + case 'v':
|
| + Advance(2);
|
| + builder->AddCharacter('\v');
|
| + break;
|
| + case 'c': {
|
| + Advance();
|
| + uc32 controlLetter = Next();
|
| + // Special case if it is an ASCII letter.
|
| + // Convert lower case letters to uppercase.
|
| + uc32 letter = controlLetter & ~('a' ^ 'A');
|
| + if (letter < 'A' || 'Z' < letter) {
|
| + // controlLetter is not in range 'A'-'Z' or 'a'-'z'.
|
| + // This is outside the specification. We match JSC in
|
| + // reading the backslash as a literal character instead
|
| + // of as starting an escape.
|
| + builder->AddCharacter('\\');
|
| + } else {
|
| + Advance(2);
|
| + builder->AddCharacter(controlLetter & 0x1f);
|
| + }
|
| + break;
|
| + }
|
| + case 'x': {
|
| + Advance(2);
|
| + uc32 value;
|
| + if (ParseHexEscape(2, &value)) {
|
| + builder->AddCharacter(value);
|
| + } else if (!FLAG_harmony_unicode_regexps || !unicode_) {
|
| + builder->AddCharacter('x');
|
| + } else {
|
| + // If the 'u' flag is present, invalid escapes are not treated as
|
| + // identity escapes.
|
| + return ReportError(CStrVector("Invalid escape"));
|
| + }
|
| + break;
|
| + }
|
| + case 'u': {
|
| + Advance(2);
|
| + uc32 value;
|
| + if (ParseUnicodeEscape(&value)) {
|
| + builder->AddCharacter(value);
|
| + } else if (!FLAG_harmony_unicode_regexps || !unicode_) {
|
| + builder->AddCharacter('u');
|
| + } else {
|
| + // If the 'u' flag is present, invalid escapes are not treated as
|
| + // identity escapes.
|
| + return ReportError(CStrVector("Invalid unicode escape"));
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + Advance();
|
| + // If the 'u' flag is present, only syntax characters can be
|
| + // escaped, no
|
| + // other identity escapes are allowed. If the 'u' flag is not
|
| + // present,
|
| + // all identity escapes are allowed.
|
| + if (!FLAG_harmony_unicode_regexps || !unicode_ ||
|
| + IsSyntaxCharacter(current())) {
|
| + builder->AddCharacter(current());
|
| + Advance();
|
| + } else {
|
| + return ReportError(CStrVector("Invalid escape"));
|
| + }
|
| + break;
|
| }
|
| break;
|
| - }
|
| - case 'u': {
|
| - Advance(2);
|
| - uc32 value;
|
| - if (ParseUnicodeEscape(&value)) {
|
| - builder->AddCharacter(value);
|
| - } else if (!FLAG_harmony_unicode_regexps || !unicode_) {
|
| - builder->AddCharacter('u');
|
| - } else {
|
| - // If the 'u' flag is present, invalid escapes are not treated as
|
| - // identity escapes.
|
| - return ReportError(CStrVector("Invalid unicode escape"));
|
| + case '{': {
|
| + int dummy;
|
| + if (ParseIntervalQuantifier(&dummy, &dummy)) {
|
| + ReportError(CStrVector("Nothing to repeat") CHECK_FAILED);
|
| }
|
| - break;
|
| + // fallthrough
|
| }
|
| default:
|
| + builder->AddCharacter(current());
|
| Advance();
|
| - // If the 'u' flag is present, only syntax characters can be escaped, no
|
| - // other identity escapes are allowed. If the 'u' flag is not present,
|
| - // all identity escapes are allowed.
|
| - if (!FLAG_harmony_unicode_regexps || !unicode_ ||
|
| - IsSyntaxCharacter(current())) {
|
| - builder->AddCharacter(current());
|
| - Advance();
|
| - } else {
|
| - return ReportError(CStrVector("Invalid escape"));
|
| - }
|
| break;
|
| - }
|
| - break;
|
| - case '{': {
|
| - int dummy;
|
| - if (ParseIntervalQuantifier(&dummy, &dummy)) {
|
| - ReportError(CStrVector("Nothing to repeat") CHECK_FAILED);
|
| - }
|
| - // fallthrough
|
| - }
|
| - default:
|
| - builder->AddCharacter(current());
|
| - Advance();
|
| - break;
|
| } // end switch(current())
|
|
|
| int min;
|
| int max;
|
| switch (current()) {
|
| - // QuantifierPrefix ::
|
| - // *
|
| - // +
|
| - // ?
|
| - // {
|
| - case '*':
|
| - min = 0;
|
| - max = RegExpTree::kInfinity;
|
| - Advance();
|
| - break;
|
| - case '+':
|
| - min = 1;
|
| - max = RegExpTree::kInfinity;
|
| - Advance();
|
| - break;
|
| - case '?':
|
| - min = 0;
|
| - max = 1;
|
| - Advance();
|
| - break;
|
| - case '{':
|
| - if (ParseIntervalQuantifier(&min, &max)) {
|
| - if (max < min) {
|
| - ReportError(CStrVector("numbers out of order in {} quantifier.")
|
| - CHECK_FAILED);
|
| - }
|
| + // QuantifierPrefix ::
|
| + // *
|
| + // +
|
| + // ?
|
| + // {
|
| + case '*':
|
| + min = 0;
|
| + max = RegExpTree::kInfinity;
|
| + Advance();
|
| break;
|
| - } else {
|
| + case '+':
|
| + min = 1;
|
| + max = RegExpTree::kInfinity;
|
| + Advance();
|
| + break;
|
| + case '?':
|
| + min = 0;
|
| + max = 1;
|
| + Advance();
|
| + break;
|
| + case '{':
|
| + if (ParseIntervalQuantifier(&min, &max)) {
|
| + if (max < min) {
|
| + ReportError(CStrVector("numbers out of order in {} quantifier.")
|
| + CHECK_FAILED);
|
| + }
|
| + break;
|
| + } else {
|
| + continue;
|
| + }
|
| + default:
|
| continue;
|
| - }
|
| - default:
|
| - continue;
|
| }
|
| RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY;
|
| if (current() == '?') {
|
| @@ -5647,9 +5646,12 @@ RegExpTree* RegExpParser::ParseDisjunction() {
|
| // Currently only used in an DCHECK.
|
| static bool IsSpecialClassEscape(uc32 c) {
|
| switch (c) {
|
| - case 'd': case 'D':
|
| - case 's': case 'S':
|
| - case 'w': case 'W':
|
| + case 'd':
|
| + case 'D':
|
| + case 's':
|
| + case 'S':
|
| + case 'w':
|
| + case 'W':
|
| return true;
|
| default:
|
| return false;
|
| @@ -5936,8 +5938,7 @@ uc32 RegExpParser::ParseClassCharacterEscape() {
|
| // For compatibility with JSC, inside a character class
|
| // we also accept digits and underscore as control characters.
|
| if ((controlLetter >= '0' && controlLetter <= '9') ||
|
| - controlLetter == '_' ||
|
| - (letter >= 'A' && letter <= 'Z')) {
|
| + controlLetter == '_' || (letter >= 'A' && letter <= 'Z')) {
|
| Advance(2);
|
| // Control letters mapped to ASCII control characters in the range
|
| // 0x00-0x1f.
|
| @@ -5947,8 +5948,14 @@ uc32 RegExpParser::ParseClassCharacterEscape() {
|
| // character instead of as starting an escape.
|
| return '\\';
|
| }
|
| - case '0': case '1': case '2': case '3': case '4': case '5':
|
| - case '6': case '7':
|
| + case '0':
|
| + case '1':
|
| + case '2':
|
| + case '3':
|
| + case '4':
|
| + case '5':
|
| + case '6':
|
| + case '7':
|
| // For compatibility, we interpret a decimal escape that isn't
|
| // a back reference (and therefore either \0 or not valid according
|
| // to the specification) as a 1..3 digit octal character code.
|
| @@ -6006,7 +6013,12 @@ CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) {
|
| uc32 first = current();
|
| if (first == '\\') {
|
| switch (Next()) {
|
| - case 'w': case 'W': case 'd': case 'D': case 's': case 'S': {
|
| + case 'w':
|
| + case 'W':
|
| + case 'd':
|
| + case 'D':
|
| + case 's':
|
| + case 'S': {
|
| *char_class = Next();
|
| Advance(2);
|
| return CharacterRange::Singleton(0); // Return dummy value.
|
| @@ -6030,8 +6042,7 @@ static const uc16 kNoCharClass = 0;
|
| // If char_class is not kInvalidClass, it's interpreted as a class
|
| // escape (i.e., 's' means whitespace, from '\s').
|
| static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges,
|
| - uc16 char_class,
|
| - CharacterRange range,
|
| + uc16 char_class, CharacterRange range,
|
| Zone* zone) {
|
| if (char_class != kNoCharClass) {
|
| CharacterRange::AddClassEscape(char_class, ranges, zone);
|
| @@ -6053,7 +6064,7 @@ RegExpTree* RegExpParser::ParseCharacterClass() {
|
| Advance();
|
| }
|
| ZoneList<CharacterRange>* ranges =
|
| - new(zone()) ZoneList<CharacterRange>(2, zone());
|
| + new (zone()) ZoneList<CharacterRange>(2, zone());
|
| while (has_more() && current() != ']') {
|
| uc16 char_class = kNoCharClass;
|
| CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
|
| @@ -6249,8 +6260,8 @@ Expression* Parser::CloseTemplateLiteral(TemplateLiteralState* state, int start,
|
| args, sub->position());
|
|
|
| expr = factory()->NewBinaryOperation(
|
| - Token::ADD, factory()->NewBinaryOperation(
|
| - Token::ADD, expr, middle, expr->position()),
|
| + Token::ADD, factory()->NewBinaryOperation(Token::ADD, expr, middle,
|
| + expr->position()),
|
| cooked_str, sub->position());
|
| }
|
| return expr;
|
| @@ -6266,11 +6277,10 @@ Expression* Parser::CloseTemplateLiteral(TemplateLiteralState* state, int start,
|
| const_cast<ZoneList<Expression*>*>(cooked_strings),
|
| cooked_idx, is_strong(language_mode()), pos),
|
| zone());
|
| - args->Add(
|
| - factory()->NewArrayLiteral(
|
| - const_cast<ZoneList<Expression*>*>(raw_strings), raw_idx,
|
| - is_strong(language_mode()), pos),
|
| - zone());
|
| + args->Add(factory()->NewArrayLiteral(
|
| + const_cast<ZoneList<Expression*>*>(raw_strings), raw_idx,
|
| + is_strong(language_mode()), pos),
|
| + zone());
|
|
|
| // Ensure hash is suitable as a Smi value
|
| Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash)));
|
| @@ -6299,8 +6309,8 @@ uint32_t Parser::ComputeTemplateLiteralHash(const TemplateLiteral* lit) {
|
|
|
| for (int index = 0; index < total; ++index) {
|
| if (index) {
|
| - running_hash = StringHasher::ComputeRunningHashOneByte(
|
| - running_hash, "${}", 3);
|
| + running_hash =
|
| + StringHasher::ComputeRunningHashOneByte(running_hash, "${}", 3);
|
| }
|
|
|
| const AstRawString* raw_string =
|
|
|