Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Side by Side Diff: src/parsing/parser.cc

Issue 2267663002: [parser] Apply an adaptation of the CRTP (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@nickie-2263973003-add-const
Patch Set: Formatting Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 290
291 #define CHECK_FAILED /**/); \ 291 #define CHECK_FAILED /**/); \
292 if (failed_) return nullptr; \ 292 if (failed_) return nullptr; \
293 ((void)0 293 ((void)0
294 #define DUMMY ) // to make indentation work 294 #define DUMMY ) // to make indentation work
295 #undef DUMMY 295 #undef DUMMY
296 296
297 // ---------------------------------------------------------------------------- 297 // ----------------------------------------------------------------------------
298 // Implementation of Parser 298 // Implementation of Parser
299 299
300 bool ParserTraits::IsEval(const AstRawString* identifier) const { 300 bool ParserBaseTraits<Parser>::IsEval(const AstRawString* identifier) const {
301 return identifier == parser_->ast_value_factory()->eval_string(); 301 return identifier == delegate()->ast_value_factory()->eval_string();
302 } 302 }
303 303
304 bool ParserTraits::IsArguments(const AstRawString* identifier) const { 304 bool ParserBaseTraits<Parser>::IsArguments(
305 return identifier == parser_->ast_value_factory()->arguments_string(); 305 const AstRawString* identifier) const {
306 return identifier == delegate()->ast_value_factory()->arguments_string();
306 } 307 }
307 308
308 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { 309 bool ParserBaseTraits<Parser>::IsEvalOrArguments(
310 const AstRawString* identifier) const {
309 return IsEval(identifier) || IsArguments(identifier); 311 return IsEval(identifier) || IsArguments(identifier);
310 } 312 }
311 313
312 bool ParserTraits::IsUndefined(const AstRawString* identifier) const { 314 bool ParserBaseTraits<Parser>::IsUndefined(
313 return identifier == parser_->ast_value_factory()->undefined_string(); 315 const AstRawString* identifier) const {
316 return identifier == delegate()->ast_value_factory()->undefined_string();
314 } 317 }
315 318
316 bool ParserTraits::IsPrototype(const AstRawString* identifier) const { 319 bool ParserBaseTraits<Parser>::IsPrototype(
317 return identifier == parser_->ast_value_factory()->prototype_string(); 320 const AstRawString* identifier) const {
321 return identifier == delegate()->ast_value_factory()->prototype_string();
318 } 322 }
319 323
320 324 bool ParserBaseTraits<Parser>::IsConstructor(
321 bool ParserTraits::IsConstructor(const AstRawString* identifier) const { 325 const AstRawString* identifier) const {
322 return identifier == parser_->ast_value_factory()->constructor_string(); 326 return identifier == delegate()->ast_value_factory()->constructor_string();
323 } 327 }
324 328
325 329 bool ParserBaseTraits<Parser>::IsThisProperty(Expression* expression) {
326 bool ParserTraits::IsThisProperty(Expression* expression) {
327 DCHECK(expression != NULL); 330 DCHECK(expression != NULL);
328 Property* property = expression->AsProperty(); 331 Property* property = expression->AsProperty();
329 return property != NULL && property->obj()->IsVariableProxy() && 332 return property != NULL && property->obj()->IsVariableProxy() &&
330 property->obj()->AsVariableProxy()->is_this(); 333 property->obj()->AsVariableProxy()->is_this();
331 } 334 }
332 335
333 336 bool ParserBaseTraits<Parser>::IsIdentifier(Expression* expression) {
334 bool ParserTraits::IsIdentifier(Expression* expression) {
335 VariableProxy* operand = expression->AsVariableProxy(); 337 VariableProxy* operand = expression->AsVariableProxy();
336 return operand != NULL && !operand->is_this(); 338 return operand != NULL && !operand->is_this();
337 } 339 }
338 340
339 341 void ParserBaseTraits<Parser>::PushPropertyName(FuncNameInferrer* fni,
340 void ParserTraits::PushPropertyName(FuncNameInferrer* fni, 342 Expression* expression) {
341 Expression* expression) {
342 if (expression->IsPropertyName()) { 343 if (expression->IsPropertyName()) {
343 fni->PushLiteralName(expression->AsLiteral()->AsRawPropertyName()); 344 fni->PushLiteralName(expression->AsLiteral()->AsRawPropertyName());
344 } else { 345 } else {
345 fni->PushLiteralName( 346 fni->PushLiteralName(
346 parser_->ast_value_factory()->anonymous_function_string()); 347 delegate()->ast_value_factory()->anonymous_function_string());
347 } 348 }
348 } 349 }
349 350
350 351 void ParserBaseTraits<Parser>::CheckAssigningFunctionLiteralToProperty(
351 void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, 352 Expression* left, Expression* right) {
352 Expression* right) {
353 DCHECK(left != NULL); 353 DCHECK(left != NULL);
354 if (left->IsProperty() && right->IsFunctionLiteral()) { 354 if (left->IsProperty() && right->IsFunctionLiteral()) {
355 right->AsFunctionLiteral()->set_pretenure(); 355 right->AsFunctionLiteral()->set_pretenure();
356 } 356 }
357 } 357 }
358 358
359 359 Expression* ParserBaseTraits<Parser>::MarkExpressionAsAssigned(
360 Expression* ParserTraits::MarkExpressionAsAssigned(Expression* expression) { 360 Expression* expression) {
361 VariableProxy* proxy = 361 VariableProxy* proxy =
362 expression != NULL ? expression->AsVariableProxy() : NULL; 362 expression != NULL ? expression->AsVariableProxy() : NULL;
363 if (proxy != NULL) proxy->set_is_assigned(); 363 if (proxy != NULL) proxy->set_is_assigned();
364 return expression; 364 return expression;
365 } 365 }
366 366
367 367 bool ParserBaseTraits<Parser>::ShortcutNumericLiteralBinaryExpression(
368 bool ParserTraits::ShortcutNumericLiteralBinaryExpression(
369 Expression** x, Expression* y, Token::Value op, int pos, 368 Expression** x, Expression* y, Token::Value op, int pos,
370 AstNodeFactory* factory) { 369 AstNodeFactory* factory) {
371 if ((*x)->AsLiteral() && (*x)->AsLiteral()->raw_value()->IsNumber() && 370 if ((*x)->AsLiteral() && (*x)->AsLiteral()->raw_value()->IsNumber() &&
372 y->AsLiteral() && y->AsLiteral()->raw_value()->IsNumber()) { 371 y->AsLiteral() && y->AsLiteral()->raw_value()->IsNumber()) {
373 double x_val = (*x)->AsLiteral()->raw_value()->AsNumber(); 372 double x_val = (*x)->AsLiteral()->raw_value()->AsNumber();
374 double y_val = y->AsLiteral()->raw_value()->AsNumber(); 373 double y_val = y->AsLiteral()->raw_value()->AsNumber();
375 bool x_has_dot = (*x)->AsLiteral()->raw_value()->ContainsDot(); 374 bool x_has_dot = (*x)->AsLiteral()->raw_value()->ContainsDot();
376 bool y_has_dot = y->AsLiteral()->raw_value()->ContainsDot(); 375 bool y_has_dot = y->AsLiteral()->raw_value()->ContainsDot();
377 bool has_dot = x_has_dot || y_has_dot; 376 bool has_dot = x_has_dot || y_has_dot;
378 switch (op) { 377 switch (op) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 has_dot); 427 has_dot);
429 return true; 428 return true;
430 } 429 }
431 default: 430 default:
432 break; 431 break;
433 } 432 }
434 } 433 }
435 return false; 434 return false;
436 } 435 }
437 436
438 437 Expression* ParserBaseTraits<Parser>::BuildUnaryExpression(
439 Expression* ParserTraits::BuildUnaryExpression(Expression* expression, 438 Expression* expression, Token::Value op, int pos, AstNodeFactory* factory) {
440 Token::Value op, int pos,
441 AstNodeFactory* factory) {
442 DCHECK(expression != NULL); 439 DCHECK(expression != NULL);
443 if (expression->IsLiteral()) { 440 if (expression->IsLiteral()) {
444 const AstValue* literal = expression->AsLiteral()->raw_value(); 441 const AstValue* literal = expression->AsLiteral()->raw_value();
445 if (op == Token::NOT) { 442 if (op == Token::NOT) {
446 // Convert the literal to a boolean condition and negate it. 443 // Convert the literal to a boolean condition and negate it.
447 bool condition = literal->BooleanValue(); 444 bool condition = literal->BooleanValue();
448 return factory->NewBooleanLiteral(!condition, pos); 445 return factory->NewBooleanLiteral(!condition, pos);
449 } else if (literal->IsNumber()) { 446 } else if (literal->IsNumber()) {
450 // Compute some expressions involving only number literals. 447 // Compute some expressions involving only number literals.
451 double value = literal->AsNumber(); 448 double value = literal->AsNumber();
(...skipping 21 matching lines...) Expand all
473 Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos); 470 Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos);
474 } 471 }
475 // ...and one more time for '~foo' => 'foo^(~0)'. 472 // ...and one more time for '~foo' => 'foo^(~0)'.
476 if (op == Token::BIT_NOT) { 473 if (op == Token::BIT_NOT) {
477 return factory->NewBinaryOperation( 474 return factory->NewBinaryOperation(
478 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); 475 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos);
479 } 476 }
480 return factory->NewUnaryOperation(op, expression, pos); 477 return factory->NewUnaryOperation(op, expression, pos);
481 } 478 }
482 479
483 Expression* ParserTraits::BuildIteratorResult(Expression* value, bool done) { 480 Expression* ParserBaseTraits<Parser>::BuildIteratorResult(Expression* value,
481 bool done) {
484 int pos = kNoSourcePosition; 482 int pos = kNoSourcePosition;
485 AstNodeFactory* factory = parser_->factory(); 483 AstNodeFactory* factory = delegate()->factory();
486 Zone* zone = parser_->zone(); 484 Zone* zone = delegate()->zone();
487 485
488 if (value == nullptr) value = factory->NewUndefinedLiteral(pos); 486 if (value == nullptr) value = factory->NewUndefinedLiteral(pos);
489 487
490 auto args = new (zone) ZoneList<Expression*>(2, zone); 488 auto args = new (zone) ZoneList<Expression*>(2, zone);
491 args->Add(value, zone); 489 args->Add(value, zone);
492 args->Add(factory->NewBooleanLiteral(done, pos), zone); 490 args->Add(factory->NewBooleanLiteral(done, pos), zone);
493 491
494 return factory->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args, 492 return factory->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args,
495 pos); 493 pos);
496 } 494 }
497 495
498 Expression* ParserTraits::NewThrowReferenceError( 496 Expression* ParserBaseTraits<Parser>::NewThrowReferenceError(
499 MessageTemplate::Template message, int pos) { 497 MessageTemplate::Template message, int pos) {
500 return parser_->NewThrowError(Runtime::kNewReferenceError, message, 498 return delegate()->NewThrowError(
501 parser_->ast_value_factory()->empty_string(), 499 Runtime::kNewReferenceError, message,
502 pos); 500 delegate()->ast_value_factory()->empty_string(), pos);
503 } 501 }
504 502
505 503 Expression* ParserBaseTraits<Parser>::NewThrowSyntaxError(
506 Expression* ParserTraits::NewThrowSyntaxError(MessageTemplate::Template message, 504 MessageTemplate::Template message, const AstRawString* arg, int pos) {
507 const AstRawString* arg, 505 return delegate()->NewThrowError(Runtime::kNewSyntaxError, message, arg, pos);
508 int pos) {
509 return parser_->NewThrowError(Runtime::kNewSyntaxError, message, arg, pos);
510 } 506 }
511 507
512 508 Expression* ParserBaseTraits<Parser>::NewThrowTypeError(
513 Expression* ParserTraits::NewThrowTypeError(MessageTemplate::Template message, 509 MessageTemplate::Template message, const AstRawString* arg, int pos) {
514 const AstRawString* arg, int pos) { 510 return delegate()->NewThrowError(Runtime::kNewTypeError, message, arg, pos);
515 return parser_->NewThrowError(Runtime::kNewTypeError, message, arg, pos);
516 } 511 }
517 512
518 Expression* Parser::NewThrowError(Runtime::FunctionId id, 513 Expression* Parser::NewThrowError(Runtime::FunctionId id,
519 MessageTemplate::Template message, 514 MessageTemplate::Template message,
520 const AstRawString* arg, int pos) { 515 const AstRawString* arg, int pos) {
521 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); 516 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
522 args->Add(factory()->NewSmiLiteral(message, pos), zone()); 517 args->Add(factory()->NewSmiLiteral(message, pos), zone());
523 args->Add(factory()->NewStringLiteral(arg, pos), zone()); 518 args->Add(factory()->NewStringLiteral(arg, pos), zone());
524 CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos); 519 CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos);
525 return factory()->NewThrow(call_constructor, pos); 520 return factory()->NewThrow(call_constructor, pos);
526 } 521 }
527 522
528 523 void ParserBaseTraits<Parser>::ReportMessageAt(
529 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 524 Scanner::Location source_location, MessageTemplate::Template message,
530 MessageTemplate::Template message, 525 const char* arg, ParseErrorType error_type) {
531 const char* arg, ParseErrorType error_type) { 526 if (delegate()->stack_overflow()) {
532 if (parser_->stack_overflow()) {
533 // Suppress the error message (syntax error or such) in the presence of a 527 // Suppress the error message (syntax error or such) in the presence of a
534 // stack overflow. The isolate allows only one pending exception at at time 528 // stack overflow. The isolate allows only one pending exception at at time
535 // and we want to report the stack overflow later. 529 // and we want to report the stack overflow later.
536 return; 530 return;
537 } 531 }
538 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, 532 delegate()->pending_error_handler_.ReportMessageAt(source_location.beg_pos,
539 source_location.end_pos, 533 source_location.end_pos,
540 message, arg, error_type); 534 message, arg, error_type);
541 } 535 }
542 536
543 537 void ParserBaseTraits<Parser>::ReportMessageAt(
544 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 538 Scanner::Location source_location, MessageTemplate::Template message,
545 MessageTemplate::Template message, 539 const AstRawString* arg, ParseErrorType error_type) {
546 const AstRawString* arg, 540 if (delegate()->stack_overflow()) {
547 ParseErrorType error_type) {
548 if (parser_->stack_overflow()) {
549 // Suppress the error message (syntax error or such) in the presence of a 541 // Suppress the error message (syntax error or such) in the presence of a
550 // stack overflow. The isolate allows only one pending exception at at time 542 // stack overflow. The isolate allows only one pending exception at at time
551 // and we want to report the stack overflow later. 543 // and we want to report the stack overflow later.
552 return; 544 return;
553 } 545 }
554 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, 546 delegate()->pending_error_handler_.ReportMessageAt(source_location.beg_pos,
555 source_location.end_pos, 547 source_location.end_pos,
556 message, arg, error_type); 548 message, arg, error_type);
557 } 549 }
558 550
559 551 const AstRawString* ParserBaseTraits<Parser>::GetSymbol(
560 const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) const { 552 Scanner* scanner) const {
561 const AstRawString* result = 553 const AstRawString* result =
562 parser_->scanner()->CurrentSymbol(parser_->ast_value_factory()); 554 delegate()->scanner()->CurrentSymbol(delegate()->ast_value_factory());
563 DCHECK(result != NULL); 555 DCHECK(result != NULL);
564 return result; 556 return result;
565 } 557 }
566 558
567 559 const AstRawString* ParserBaseTraits<Parser>::GetNumberAsSymbol(
568 const AstRawString* ParserTraits::GetNumberAsSymbol(Scanner* scanner) const { 560 Scanner* scanner) const {
569 double double_value = parser_->scanner()->DoubleValue(); 561 double double_value = delegate()->scanner()->DoubleValue();
570 char array[100]; 562 char array[100];
571 const char* string = DoubleToCString(double_value, ArrayVector(array)); 563 const char* string = DoubleToCString(double_value, ArrayVector(array));
572 return parser_->ast_value_factory()->GetOneByteString(string); 564 return delegate()->ast_value_factory()->GetOneByteString(string);
573 } 565 }
574 566
575 567 const AstRawString* ParserBaseTraits<Parser>::GetNextSymbol(
576 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) const { 568 Scanner* scanner) const {
577 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); 569 return delegate()->scanner()->NextSymbol(delegate()->ast_value_factory());
578 } 570 }
579 571
580 Expression* ParserTraits::ThisExpression(int pos) { 572 Expression* ParserBaseTraits<Parser>::ThisExpression(int pos) {
581 return parser_->NewUnresolved(parser_->ast_value_factory()->this_string(), 573 return delegate()->NewUnresolved(
582 pos, pos + 4, Variable::THIS); 574 delegate()->ast_value_factory()->this_string(), pos, pos + 4,
575 Variable::THIS);
583 } 576 }
584 577
585 Expression* ParserTraits::NewSuperPropertyReference(AstNodeFactory* factory, 578 Expression* ParserBaseTraits<Parser>::NewSuperPropertyReference(
586 int pos) { 579 AstNodeFactory* factory, int pos) {
587 // this_function[home_object_symbol] 580 // this_function[home_object_symbol]
588 VariableProxy* this_function_proxy = parser_->NewUnresolved( 581 VariableProxy* this_function_proxy = delegate()->NewUnresolved(
589 parser_->ast_value_factory()->this_function_string(), pos); 582 delegate()->ast_value_factory()->this_function_string(), pos);
590 Expression* home_object_symbol_literal = 583 Expression* home_object_symbol_literal =
591 factory->NewSymbolLiteral("home_object_symbol", kNoSourcePosition); 584 factory->NewSymbolLiteral("home_object_symbol", kNoSourcePosition);
592 Expression* home_object = factory->NewProperty( 585 Expression* home_object = factory->NewProperty(
593 this_function_proxy, home_object_symbol_literal, pos); 586 this_function_proxy, home_object_symbol_literal, pos);
594 return factory->NewSuperPropertyReference( 587 return factory->NewSuperPropertyReference(
595 ThisExpression(pos)->AsVariableProxy(), home_object, pos); 588 ThisExpression(pos)->AsVariableProxy(), home_object, pos);
596 } 589 }
597 590
598 Expression* ParserTraits::NewSuperCallReference(AstNodeFactory* factory, 591 Expression* ParserBaseTraits<Parser>::NewSuperCallReference(
599 int pos) { 592 AstNodeFactory* factory, int pos) {
600 VariableProxy* new_target_proxy = parser_->NewUnresolved( 593 VariableProxy* new_target_proxy = delegate()->NewUnresolved(
601 parser_->ast_value_factory()->new_target_string(), pos); 594 delegate()->ast_value_factory()->new_target_string(), pos);
602 VariableProxy* this_function_proxy = parser_->NewUnresolved( 595 VariableProxy* this_function_proxy = delegate()->NewUnresolved(
603 parser_->ast_value_factory()->this_function_string(), pos); 596 delegate()->ast_value_factory()->this_function_string(), pos);
604 return factory->NewSuperCallReference(ThisExpression(pos)->AsVariableProxy(), 597 return factory->NewSuperCallReference(ThisExpression(pos)->AsVariableProxy(),
605 new_target_proxy, this_function_proxy, 598 new_target_proxy, this_function_proxy,
606 pos); 599 pos);
607 } 600 }
608 601
609 Expression* ParserTraits::NewTargetExpression(int pos) { 602 Expression* ParserBaseTraits<Parser>::NewTargetExpression(int pos) {
610 static const int kNewTargetStringLength = 10; 603 static const int kNewTargetStringLength = 10;
611 auto proxy = 604 auto proxy = delegate()->NewUnresolved(
612 parser_->NewUnresolved(parser_->ast_value_factory()->new_target_string(), 605 delegate()->ast_value_factory()->new_target_string(), pos,
613 pos, pos + kNewTargetStringLength); 606 pos + kNewTargetStringLength);
614 proxy->set_is_new_target(); 607 proxy->set_is_new_target();
615 return proxy; 608 return proxy;
616 } 609 }
617 610
618 Expression* ParserTraits::FunctionSentExpression(AstNodeFactory* factory, 611 Expression* ParserBaseTraits<Parser>::FunctionSentExpression(
619 int pos) const { 612 AstNodeFactory* factory, int pos) const {
620 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). 613 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator).
621 Zone* zone = parser_->zone(); 614 Zone* zone = delegate()->zone();
622 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(1, zone); 615 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(1, zone);
623 VariableProxy* generator = factory->NewVariableProxy( 616 VariableProxy* generator = factory->NewVariableProxy(
624 parser_->function_state_->generator_object_variable()); 617 delegate()->function_state_->generator_object_variable());
625 args->Add(generator, zone); 618 args->Add(generator, zone);
626 return factory->NewCallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos, 619 return factory->NewCallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos,
627 args, pos); 620 args, pos);
628 } 621 }
629 622
630 623 Literal* ParserBaseTraits<Parser>::ExpressionFromLiteral(
631 Literal* ParserTraits::ExpressionFromLiteral(Token::Value token, int pos, 624 Token::Value token, int pos, Scanner* scanner,
632 Scanner* scanner, 625 AstNodeFactory* factory) const {
633 AstNodeFactory* factory) const {
634 switch (token) { 626 switch (token) {
635 case Token::NULL_LITERAL: 627 case Token::NULL_LITERAL:
636 return factory->NewNullLiteral(pos); 628 return factory->NewNullLiteral(pos);
637 case Token::TRUE_LITERAL: 629 case Token::TRUE_LITERAL:
638 return factory->NewBooleanLiteral(true, pos); 630 return factory->NewBooleanLiteral(true, pos);
639 case Token::FALSE_LITERAL: 631 case Token::FALSE_LITERAL:
640 return factory->NewBooleanLiteral(false, pos); 632 return factory->NewBooleanLiteral(false, pos);
641 case Token::SMI: { 633 case Token::SMI: {
642 int value = scanner->smi_value(); 634 int value = scanner->smi_value();
643 return factory->NewSmiLiteral(value, pos); 635 return factory->NewSmiLiteral(value, pos);
644 } 636 }
645 case Token::NUMBER: { 637 case Token::NUMBER: {
646 bool has_dot = scanner->ContainsDot(); 638 bool has_dot = scanner->ContainsDot();
647 double value = scanner->DoubleValue(); 639 double value = scanner->DoubleValue();
648 return factory->NewNumberLiteral(value, pos, has_dot); 640 return factory->NewNumberLiteral(value, pos, has_dot);
649 } 641 }
650 default: 642 default:
651 DCHECK(false); 643 DCHECK(false);
652 } 644 }
653 return NULL; 645 return NULL;
654 } 646 }
655 647
656 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, 648 Expression* ParserBaseTraits<Parser>::ExpressionFromIdentifier(
657 int start_position, 649 const AstRawString* name, int start_position, int end_position,
658 int end_position, 650 InferName infer) {
659 InferName infer) { 651 if (infer == InferName::kYes && delegate()->fni_ != NULL) {
660 if (infer == InferName::kYes && parser_->fni_ != NULL) { 652 delegate()->fni_->PushVariableName(name);
661 parser_->fni_->PushVariableName(name);
662 } 653 }
663 return parser_->NewUnresolved(name, start_position, end_position); 654 return delegate()->NewUnresolved(name, start_position, end_position);
664 } 655 }
665 656
666 657 Expression* ParserBaseTraits<Parser>::ExpressionFromString(
667 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, 658 int pos, Scanner* scanner, AstNodeFactory* factory) const {
668 AstNodeFactory* factory) const {
669 const AstRawString* symbol = GetSymbol(scanner); 659 const AstRawString* symbol = GetSymbol(scanner);
670 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); 660 if (delegate()->fni_ != NULL) delegate()->fni_->PushLiteralName(symbol);
671 return factory->NewStringLiteral(symbol, pos); 661 return factory->NewStringLiteral(symbol, pos);
672 } 662 }
673 663
674 664 Expression* ParserBaseTraits<Parser>::GetIterator(Expression* iterable,
675 Expression* ParserTraits::GetIterator(Expression* iterable, 665 AstNodeFactory* factory,
676 AstNodeFactory* factory, int pos) { 666 int pos) {
677 Expression* iterator_symbol_literal = 667 Expression* iterator_symbol_literal =
678 factory->NewSymbolLiteral("iterator_symbol", kNoSourcePosition); 668 factory->NewSymbolLiteral("iterator_symbol", kNoSourcePosition);
679 Expression* prop = 669 Expression* prop =
680 factory->NewProperty(iterable, iterator_symbol_literal, pos); 670 factory->NewProperty(iterable, iterator_symbol_literal, pos);
681 Zone* zone = parser_->zone(); 671 Zone* zone = delegate()->zone();
682 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone); 672 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone);
683 return factory->NewCall(prop, args, pos); 673 return factory->NewCall(prop, args, pos);
684 } 674 }
685 675
686 676 Literal* ParserBaseTraits<Parser>::GetLiteralTheHole(
687 Literal* ParserTraits::GetLiteralTheHole(int position, 677 int position, AstNodeFactory* factory) const {
688 AstNodeFactory* factory) const {
689 return factory->NewTheHoleLiteral(kNoSourcePosition); 678 return factory->NewTheHoleLiteral(kNoSourcePosition);
690 } 679 }
691 680
692 681 Expression* ParserBaseTraits<Parser>::ParseV8Intrinsic(bool* ok) {
693 Expression* ParserTraits::ParseV8Intrinsic(bool* ok) { 682 return delegate()->ParseV8Intrinsic(ok);
694 return parser_->ParseV8Intrinsic(ok);
695 } 683 }
696 684
697 685 FunctionLiteral* ParserBaseTraits<Parser>::ParseFunctionLiteral(
698 FunctionLiteral* ParserTraits::ParseFunctionLiteral(
699 const AstRawString* name, Scanner::Location function_name_location, 686 const AstRawString* name, Scanner::Location function_name_location,
700 FunctionNameValidity function_name_validity, FunctionKind kind, 687 FunctionNameValidity function_name_validity, FunctionKind kind,
701 int function_token_position, FunctionLiteral::FunctionType type, 688 int function_token_position, FunctionLiteral::FunctionType type,
702 LanguageMode language_mode, bool* ok) { 689 LanguageMode language_mode, bool* ok) {
703 return parser_->ParseFunctionLiteral( 690 return delegate()->ParseFunctionLiteral(
704 name, function_name_location, function_name_validity, kind, 691 name, function_name_location, function_name_validity, kind,
705 function_token_position, type, language_mode, ok); 692 function_token_position, type, language_mode, ok);
706 } 693 }
707 694
708 Expression* ParserTraits::ParseClassLiteral( 695 Expression* ParserBaseTraits<Parser>::ParseClassLiteral(
709 Type::ExpressionClassifier* classifier, const AstRawString* name, 696 Type::ExpressionClassifier* classifier, const AstRawString* name,
710 Scanner::Location class_name_location, bool name_is_strict_reserved, 697 Scanner::Location class_name_location, bool name_is_strict_reserved,
711 int pos, bool* ok) { 698 int pos, bool* ok) {
712 return parser_->ParseClassLiteral(classifier, name, class_name_location, 699 return delegate()->ParseClassLiteral(classifier, name, class_name_location,
713 name_is_strict_reserved, pos, ok); 700 name_is_strict_reserved, pos, ok);
714 } 701 }
715 702
716 void ParserTraits::MarkTailPosition(Expression* expression) { 703 void ParserBaseTraits<Parser>::MarkTailPosition(Expression* expression) {
717 expression->MarkTail(); 704 expression->MarkTail();
718 } 705 }
719 706
720 void ParserTraits::MarkCollectedTailCallExpressions() { 707 void ParserBaseTraits<Parser>::MarkCollectedTailCallExpressions() {
721 parser_->MarkCollectedTailCallExpressions(); 708 delegate()->MarkCollectedTailCallExpressions();
722 } 709 }
723 710
724 Parser::Parser(ParseInfo* info) 711 Parser::Parser(ParseInfo* info)
725 : ParserBase<ParserTraits>(info->zone(), &scanner_, info->stack_limit(), 712 : ParserBase<Parser>(info->zone(), &scanner_, info->stack_limit(),
726 info->extension(), info->ast_value_factory(), 713 info->extension(), info->ast_value_factory(), NULL),
727 NULL, this),
728 scanner_(info->unicode_cache()), 714 scanner_(info->unicode_cache()),
729 reusable_preparser_(NULL), 715 reusable_preparser_(NULL),
730 original_scope_(NULL), 716 original_scope_(NULL),
731 target_stack_(NULL), 717 target_stack_(NULL),
732 compile_options_(info->compile_options()), 718 compile_options_(info->compile_options()),
733 cached_parse_data_(NULL), 719 cached_parse_data_(NULL),
734 total_preparse_skipped_(0), 720 total_preparse_skipped_(0),
735 pre_parse_timer_(NULL), 721 pre_parse_timer_(NULL),
736 parsing_on_main_thread_(true) { 722 parsing_on_main_thread_(true) {
737 // Even though we were passed ParseInfo, we should not store it in 723 // Even though we were passed ParseInfo, we should not store it in
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 if (body->length() != 1 || 932 if (body->length() != 1 ||
947 !body->at(0)->IsExpressionStatement() || 933 !body->at(0)->IsExpressionStatement() ||
948 !body->at(0)->AsExpressionStatement()-> 934 !body->at(0)->AsExpressionStatement()->
949 expression()->IsFunctionLiteral()) { 935 expression()->IsFunctionLiteral()) {
950 ReportMessage(MessageTemplate::kSingleFunctionLiteral); 936 ReportMessage(MessageTemplate::kSingleFunctionLiteral);
951 ok = false; 937 ok = false;
952 } 938 }
953 } 939 }
954 940
955 if (ok) { 941 if (ok) {
956 ParserTraits::RewriteDestructuringAssignments(); 942 ParserBaseTraits<Parser>::RewriteDestructuringAssignments();
957 result = factory()->NewScriptOrEvalFunctionLiteral( 943 result = factory()->NewScriptOrEvalFunctionLiteral(
958 scope, body, function_state.materialized_literal_count(), 944 scope, body, function_state.materialized_literal_count(),
959 function_state.expected_property_count()); 945 function_state.expected_property_count());
960 } 946 }
961 } 947 }
962 948
963 // Make sure the target stack is empty. 949 // Make sure the target stack is empty.
964 DCHECK(target_stack_ == NULL); 950 DCHECK(target_stack_ == NULL);
965 951
966 return result; 952 return result;
(...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after
2329 // Don't infer if it is "a = function(){...}();"-like expression. 2315 // Don't infer if it is "a = function(){...}();"-like expression.
2330 if (single_name) { 2316 if (single_name) {
2331 if (fni_ != NULL && value->AsCall() == NULL && 2317 if (fni_ != NULL && value->AsCall() == NULL &&
2332 value->AsCallNew() == NULL) { 2318 value->AsCallNew() == NULL) {
2333 fni_->Infer(); 2319 fni_->Infer();
2334 } else { 2320 } else {
2335 fni_->RemoveLastFunction(); 2321 fni_->RemoveLastFunction();
2336 } 2322 }
2337 } 2323 }
2338 2324
2339 ParserTraits::SetFunctionNameFromIdentifierRef(value, pattern); 2325 ParserBaseTraits<Parser>::SetFunctionNameFromIdentifierRef(value,
2326 pattern);
2340 2327
2341 // End position of the initializer is after the assignment expression. 2328 // End position of the initializer is after the assignment expression.
2342 initializer_position = scanner()->location().end_pos; 2329 initializer_position = scanner()->location().end_pos;
2343 } else { 2330 } else {
2344 // Initializers may be either required or implied unless this is a 2331 // Initializers may be either required or implied unless this is a
2345 // for-in/of iteration variable. 2332 // for-in/of iteration variable.
2346 if (var_context != kForStatement || !PeekInOrOf()) { 2333 if (var_context != kForStatement || !PeekInOrOf()) {
2347 // ES6 'const' and binding patterns require initializers. 2334 // ES6 'const' and binding patterns require initializers.
2348 if (parsing_result->descriptor.mode == CONST || 2335 if (parsing_result->descriptor.mode == CONST ||
2349 !pattern->IsVariableProxy()) { 2336 !pattern->IsVariableProxy()) {
(...skipping 1639 matching lines...) Expand 10 before | Expand all | Expand 10 after
3989 if (expr->IsAssignment()) { 3976 if (expr->IsAssignment()) {
3990 Assignment* assignment = expr->AsAssignment(); 3977 Assignment* assignment = expr->AsAssignment();
3991 DCHECK(!assignment->is_compound()); 3978 DCHECK(!assignment->is_compound());
3992 initializer = assignment->value(); 3979 initializer = assignment->value();
3993 expr = assignment->target(); 3980 expr = assignment->target();
3994 } 3981 }
3995 3982
3996 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest); 3983 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest);
3997 } 3984 }
3998 3985
3999 void ParserTraits::ParseAsyncArrowSingleExpressionBody( 3986 void ParserBaseTraits<Parser>::ParseAsyncArrowSingleExpressionBody(
4000 ZoneList<Statement*>* body, bool accept_IN, 3987 ZoneList<Statement*>* body, bool accept_IN,
4001 Type::ExpressionClassifier* classifier, int pos, bool* ok) { 3988 Type::ExpressionClassifier* classifier, int pos, bool* ok) {
4002 parser_->DesugarAsyncFunctionBody( 3989 delegate()->DesugarAsyncFunctionBody(
4003 parser_->ast_value_factory()->empty_string(), parser_->scope(), body, 3990 delegate()->ast_value_factory()->empty_string(), delegate()->scope(),
4004 classifier, kAsyncArrowFunction, 3991 body, classifier, kAsyncArrowFunction,
4005 Parser::FunctionBodyType::kSingleExpression, accept_IN, pos, ok); 3992 Parser::FunctionBodyType::kSingleExpression, accept_IN, pos, ok);
4006 } 3993 }
4007 3994
4008 void Parser::DesugarAsyncFunctionBody(const AstRawString* function_name, 3995 void Parser::DesugarAsyncFunctionBody(const AstRawString* function_name,
4009 Scope* scope, ZoneList<Statement*>* body, 3996 Scope* scope, ZoneList<Statement*>* body,
4010 ExpressionClassifier* classifier, 3997 ExpressionClassifier* classifier,
4011 FunctionKind kind, 3998 FunctionKind kind,
4012 FunctionBodyType body_type, 3999 FunctionBodyType body_type,
4013 bool accept_IN, int pos, bool* ok) { 4000 bool accept_IN, int pos, bool* ok) {
4014 // function async_function() { 4001 // function async_function() {
(...skipping 20 matching lines...) Expand all
4035 4022
4036 ZoneList<Statement*>* inner_body = try_block->statements(); 4023 ZoneList<Statement*>* inner_body = try_block->statements();
4037 4024
4038 Expression* return_value = nullptr; 4025 Expression* return_value = nullptr;
4039 if (body_type == FunctionBodyType::kNormal) { 4026 if (body_type == FunctionBodyType::kNormal) {
4040 ParseStatementList(inner_body, Token::RBRACE, CHECK_OK_VOID); 4027 ParseStatementList(inner_body, Token::RBRACE, CHECK_OK_VOID);
4041 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition); 4028 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition);
4042 } else { 4029 } else {
4043 return_value = 4030 return_value =
4044 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_VOID); 4031 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_VOID);
4045 ParserTraits::RewriteNonPattern(classifier, CHECK_OK_VOID); 4032 ParserBaseTraits<Parser>::RewriteNonPattern(classifier, CHECK_OK_VOID);
4046 } 4033 }
4047 4034
4048 return_value = BuildPromiseResolve(return_value, return_value->position()); 4035 return_value = BuildPromiseResolve(return_value, return_value->position());
4049 inner_body->Add( 4036 inner_body->Add(
4050 factory()->NewReturnStatement(return_value, return_value->position()), 4037 factory()->NewReturnStatement(return_value, return_value->position()),
4051 zone()); 4038 zone());
4052 body->Add(BuildRejectPromiseOnException(try_block), zone()); 4039 body->Add(BuildRejectPromiseOnException(try_block), zone());
4053 scope->set_end_position(scanner()->location().end_pos); 4040 scope->set_end_position(scanner()->location().end_pos);
4054 } 4041 }
4055 4042
4056 DoExpression* Parser::ParseDoExpression(bool* ok) { 4043 DoExpression* Parser::ParseDoExpression(bool* ok) {
4057 // AssignmentExpression :: 4044 // AssignmentExpression ::
4058 // do '{' StatementList '}' 4045 // do '{' StatementList '}'
4059 int pos = peek_position(); 4046 int pos = peek_position();
4060 4047
4061 Expect(Token::DO, CHECK_OK); 4048 Expect(Token::DO, CHECK_OK);
4062 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); 4049 Variable* result = NewTemporary(ast_value_factory()->dot_result_string());
4063 Block* block = ParseBlock(nullptr, CHECK_OK); 4050 Block* block = ParseBlock(nullptr, CHECK_OK);
4064 DoExpression* expr = factory()->NewDoExpression(block, result, pos); 4051 DoExpression* expr = factory()->NewDoExpression(block, result, pos);
4065 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) { 4052 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) {
4066 *ok = false; 4053 *ok = false;
4067 return nullptr; 4054 return nullptr;
4068 } 4055 }
4069 return expr; 4056 return expr;
4070 } 4057 }
4071 4058
4072 void ParserTraits::ParseArrowFunctionFormalParameterList( 4059 void ParserBaseTraits<Parser>::ParseArrowFunctionFormalParameterList(
4073 ParserFormalParameters* parameters, Expression* expr, 4060 ParserFormalParameters* parameters, Expression* expr,
4074 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, 4061 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
4075 const Scope::Snapshot& scope_snapshot, bool* ok) { 4062 const Scope::Snapshot& scope_snapshot, bool* ok) {
4076 if (expr->IsEmptyParentheses()) return; 4063 if (expr->IsEmptyParentheses()) return;
4077 4064
4078 parser_->ParseArrowFunctionFormalParameters( 4065 delegate()->ParseArrowFunctionFormalParameters(
4079 parameters, expr, params_loc.end_pos, CHECK_OK_VOID); 4066 parameters, expr, params_loc.end_pos, CHECK_OK_VOID);
4080 4067
4081 scope_snapshot.Reparent(parameters->scope); 4068 scope_snapshot.Reparent(parameters->scope);
4082 4069
4083 if (parameters->Arity() > Code::kMaxArguments) { 4070 if (parameters->Arity() > Code::kMaxArguments) {
4084 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); 4071 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList);
4085 *ok = false; 4072 *ok = false;
4086 return; 4073 return;
4087 } 4074 }
4088 4075
4089 Type::ExpressionClassifier classifier(parser_); 4076 Type::ExpressionClassifier classifier(delegate());
4090 if (!parameters->is_simple) { 4077 if (!parameters->is_simple) {
4091 classifier.RecordNonSimpleParameter(); 4078 classifier.RecordNonSimpleParameter();
4092 } 4079 }
4093 for (int i = 0; i < parameters->Arity(); ++i) { 4080 for (int i = 0; i < parameters->Arity(); ++i) {
4094 auto parameter = parameters->at(i); 4081 auto parameter = parameters->at(i);
4095 DeclareFormalParameter(parameters->scope, parameter, &classifier); 4082 DeclareFormalParameter(parameters->scope, parameter, &classifier);
4096 if (!duplicate_loc->IsValid()) { 4083 if (!duplicate_loc->IsValid()) {
4097 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; 4084 *duplicate_loc = classifier.duplicate_formal_parameter_error().location;
4098 } 4085 }
4099 } 4086 }
4100 DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters()); 4087 DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters());
4101 } 4088 }
4102 4089
4103 4090 void ParserBaseTraits<Parser>::ReindexLiterals(
4104 void ParserTraits::ReindexLiterals(const ParserFormalParameters& parameters) { 4091 const ParserFormalParameters& parameters) {
4105 if (parser_->function_state_->materialized_literal_count() > 0) { 4092 if (delegate()->function_state_->materialized_literal_count() > 0) {
4106 AstLiteralReindexer reindexer; 4093 AstLiteralReindexer reindexer;
4107 4094
4108 for (const auto p : parameters.params) { 4095 for (const auto p : parameters.params) {
4109 if (p.pattern != nullptr) reindexer.Reindex(p.pattern); 4096 if (p.pattern != nullptr) reindexer.Reindex(p.pattern);
4110 if (p.initializer != nullptr) reindexer.Reindex(p.initializer); 4097 if (p.initializer != nullptr) reindexer.Reindex(p.initializer);
4111 } 4098 }
4112 4099
4113 DCHECK(reindexer.count() <= 4100 DCHECK(reindexer.count() <=
4114 parser_->function_state_->materialized_literal_count()); 4101 delegate()->function_state_->materialized_literal_count());
4115 } 4102 }
4116 } 4103 }
4117 4104
4118 4105
4119 FunctionLiteral* Parser::ParseFunctionLiteral( 4106 FunctionLiteral* Parser::ParseFunctionLiteral(
4120 const AstRawString* function_name, Scanner::Location function_name_location, 4107 const AstRawString* function_name, Scanner::Location function_name_location,
4121 FunctionNameValidity function_name_validity, FunctionKind kind, 4108 FunctionNameValidity function_name_validity, FunctionKind kind,
4122 int function_token_pos, FunctionLiteral::FunctionType function_type, 4109 int function_token_pos, FunctionLiteral::FunctionType function_type,
4123 LanguageMode language_mode, bool* ok) { 4110 LanguageMode language_mode, bool* ok) {
4124 // Function :: 4111 // Function ::
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
4339 if (is_strict(language_mode)) { 4326 if (is_strict(language_mode)) {
4340 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), 4327 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(),
4341 CHECK_OK); 4328 CHECK_OK);
4342 CheckDecimalLiteralWithLeadingZero(use_counts_, scope->start_position(), 4329 CheckDecimalLiteralWithLeadingZero(use_counts_, scope->start_position(),
4343 scope->end_position()); 4330 scope->end_position());
4344 } 4331 }
4345 CheckConflictingVarDeclarations(scope, CHECK_OK); 4332 CheckConflictingVarDeclarations(scope, CHECK_OK);
4346 4333
4347 if (body) { 4334 if (body) {
4348 // If body can be inspected, rewrite queued destructuring assignments 4335 // If body can be inspected, rewrite queued destructuring assignments
4349 ParserTraits::RewriteDestructuringAssignments(); 4336 ParserBaseTraits<Parser>::RewriteDestructuringAssignments();
4350 } 4337 }
4351 has_duplicate_parameters = 4338 has_duplicate_parameters =
4352 !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); 4339 !formals_classifier.is_valid_formal_parameter_list_without_duplicates();
4353 4340
4354 if (use_temp_zone) { 4341 if (use_temp_zone) {
4355 DCHECK(main_scope != scope); 4342 DCHECK(main_scope != scope);
4356 scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory); 4343 scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory);
4357 } 4344 }
4358 } // DiscardableZoneScope goes out of scope. 4345 } // DiscardableZoneScope goes out of scope.
4359 4346
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
5361 5348
5362 // We cannot internalize on a background thread; a foreground task will take 5349 // We cannot internalize on a background thread; a foreground task will take
5363 // care of calling Parser::Internalize just before compilation. 5350 // care of calling Parser::Internalize just before compilation.
5364 5351
5365 if (produce_cached_parse_data()) { 5352 if (produce_cached_parse_data()) {
5366 if (result != NULL) *info->cached_data() = recorder.GetScriptData(); 5353 if (result != NULL) *info->cached_data() = recorder.GetScriptData();
5367 log_ = NULL; 5354 log_ = NULL;
5368 } 5355 }
5369 } 5356 }
5370 5357
5371 5358 ParserBaseTraits<Parser>::TemplateLiteralState Parser::OpenTemplateLiteral(
5372 ParserTraits::TemplateLiteralState Parser::OpenTemplateLiteral(int pos) { 5359 int pos) {
5373 return new (zone()) ParserTraits::TemplateLiteral(zone(), pos); 5360 return new (zone()) ParserBaseTraits<Parser>::TemplateLiteral(zone(), pos);
5374 } 5361 }
5375 5362
5376 5363
5377 void Parser::AddTemplateSpan(TemplateLiteralState* state, bool tail) { 5364 void Parser::AddTemplateSpan(TemplateLiteralState* state, bool tail) {
5378 int pos = scanner()->location().beg_pos; 5365 int pos = scanner()->location().beg_pos;
5379 int end = scanner()->location().end_pos - (tail ? 1 : 2); 5366 int end = scanner()->location().end_pos - (tail ? 1 : 2);
5380 const AstRawString* tv = scanner()->CurrentSymbol(ast_value_factory()); 5367 const AstRawString* tv = scanner()->CurrentSymbol(ast_value_factory());
5381 const AstRawString* trv = scanner()->CurrentRawSymbol(ast_value_factory()); 5368 const AstRawString* trv = scanner()->CurrentRawSymbol(ast_value_factory());
5382 Literal* cooked = factory()->NewStringLiteral(tv, pos); 5369 Literal* cooked = factory()->NewStringLiteral(tv, pos);
5383 Literal* raw = factory()->NewStringLiteral(trv, pos); 5370 Literal* raw = factory()->NewStringLiteral(trv, pos);
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
5628 for (int i = 0; i < tail_call_expressions.length(); ++i) { 5615 for (int i = 0; i < tail_call_expressions.length(); ++i) {
5629 Expression* expression = tail_call_expressions[i]; 5616 Expression* expression = tail_call_expressions[i];
5630 // If only FLAG_harmony_explicit_tailcalls is enabled then expression 5617 // If only FLAG_harmony_explicit_tailcalls is enabled then expression
5631 // must be a Call expression. 5618 // must be a Call expression.
5632 DCHECK(FLAG_harmony_tailcalls || !FLAG_harmony_explicit_tailcalls || 5619 DCHECK(FLAG_harmony_tailcalls || !FLAG_harmony_explicit_tailcalls ||
5633 expression->IsCall()); 5620 expression->IsCall());
5634 MarkTailPosition(expression); 5621 MarkTailPosition(expression);
5635 } 5622 }
5636 } 5623 }
5637 5624
5638 Expression* ParserTraits::ExpressionListToExpression( 5625 Expression* ParserBaseTraits<Parser>::ExpressionListToExpression(
5639 ZoneList<Expression*>* args) { 5626 ZoneList<Expression*>* args) {
5640 AstNodeFactory* factory = parser_->factory(); 5627 AstNodeFactory* factory = delegate()->factory();
5641 Expression* expr = args->at(0); 5628 Expression* expr = args->at(0);
5642 for (int i = 1; i < args->length(); ++i) { 5629 for (int i = 1; i < args->length(); ++i) {
5643 expr = factory->NewBinaryOperation(Token::COMMA, expr, args->at(i), 5630 expr = factory->NewBinaryOperation(Token::COMMA, expr, args->at(i),
5644 expr->position()); 5631 expr->position());
5645 } 5632 }
5646 return expr; 5633 return expr;
5647 } 5634 }
5648 5635
5649 void ParserTraits::RewriteDestructuringAssignments() { 5636 void ParserBaseTraits<Parser>::RewriteDestructuringAssignments() {
5650 parser_->RewriteDestructuringAssignments(); 5637 delegate()->RewriteDestructuringAssignments();
5651 } 5638 }
5652 5639
5653 Expression* ParserTraits::RewriteExponentiation(Expression* left, 5640 Expression* ParserBaseTraits<Parser>::RewriteExponentiation(Expression* left,
5654 Expression* right, int pos) { 5641 Expression* right,
5655 return parser_->RewriteExponentiation(left, right, pos); 5642 int pos) {
5643 return delegate()->RewriteExponentiation(left, right, pos);
5656 } 5644 }
5657 5645
5658 Expression* ParserTraits::RewriteAssignExponentiation(Expression* left, 5646 Expression* ParserBaseTraits<Parser>::RewriteAssignExponentiation(
5659 Expression* right, 5647 Expression* left, Expression* right, int pos) {
5660 int pos) { 5648 return delegate()->RewriteAssignExponentiation(left, right, pos);
5661 return parser_->RewriteAssignExponentiation(left, right, pos);
5662 } 5649 }
5663 5650
5664 void ParserTraits::RewriteNonPattern(Type::ExpressionClassifier* classifier, 5651 void ParserBaseTraits<Parser>::RewriteNonPattern(
5665 bool* ok) { 5652 Type::ExpressionClassifier* classifier, bool* ok) {
5666 parser_->RewriteNonPattern(classifier, ok); 5653 delegate()->RewriteNonPattern(classifier, ok);
5667 } 5654 }
5668 5655
5669 Expression* ParserTraits::RewriteAwaitExpression(Expression* value, 5656 Expression* ParserBaseTraits<Parser>::RewriteAwaitExpression(Expression* value,
5670 int await_pos) { 5657 int await_pos) {
5671 // yield %AsyncFunctionAwait(.generator_object, <operand>) 5658 // yield %AsyncFunctionAwait(.generator_object, <operand>)
5672 Variable* generator_object_variable = 5659 Variable* generator_object_variable =
5673 parser_->function_state_->generator_object_variable(); 5660 delegate()->function_state_->generator_object_variable();
5674 5661
5675 // If generator_object_variable is null, 5662 // If generator_object_variable is null,
5676 if (!generator_object_variable) return value; 5663 if (!generator_object_variable) return value;
5677 5664
5678 auto factory = parser_->factory(); 5665 auto factory = delegate()->factory();
5679 const int nopos = kNoSourcePosition; 5666 const int nopos = kNoSourcePosition;
5680 5667
5681 Variable* temp_var = 5668 Variable* temp_var =
5682 parser_->NewTemporary(parser_->ast_value_factory()->empty_string()); 5669 delegate()->NewTemporary(delegate()->ast_value_factory()->empty_string());
5683 VariableProxy* temp_proxy = factory->NewVariableProxy(temp_var); 5670 VariableProxy* temp_proxy = factory->NewVariableProxy(temp_var);
5684 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); 5671 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos);
5685 5672
5686 // Wrap value evaluation to provide a break location. 5673 // Wrap value evaluation to provide a break location.
5687 Expression* value_assignment = 5674 Expression* value_assignment =
5688 factory->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos); 5675 factory->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos);
5689 do_block->statements()->Add( 5676 do_block->statements()->Add(
5690 factory->NewExpressionStatement(value_assignment, value->position()), 5677 factory->NewExpressionStatement(value_assignment, value->position()),
5691 zone()); 5678 zone());
5692 5679
5693 ZoneList<Expression*>* async_function_await_args = 5680 ZoneList<Expression*>* async_function_await_args =
5694 new (zone()) ZoneList<Expression*>(2, zone()); 5681 new (zone()) ZoneList<Expression*>(2, zone());
5695 Expression* generator_object = 5682 Expression* generator_object =
5696 factory->NewVariableProxy(generator_object_variable); 5683 factory->NewVariableProxy(generator_object_variable);
5697 async_function_await_args->Add(generator_object, zone()); 5684 async_function_await_args->Add(generator_object, zone());
5698 async_function_await_args->Add(temp_proxy, zone()); 5685 async_function_await_args->Add(temp_proxy, zone());
5699 Expression* async_function_await = parser_->factory()->NewCallRuntime( 5686 Expression* async_function_await = delegate()->factory()->NewCallRuntime(
5700 Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args, nopos); 5687 Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args, nopos);
5701 // Wrap await to provide a break location between value evaluation and yield. 5688 // Wrap await to provide a break location between value evaluation and yield.
5702 Expression* await_assignment = factory->NewAssignment( 5689 Expression* await_assignment = factory->NewAssignment(
5703 Token::ASSIGN, temp_proxy, async_function_await, nopos); 5690 Token::ASSIGN, temp_proxy, async_function_await, nopos);
5704 do_block->statements()->Add( 5691 do_block->statements()->Add(
5705 factory->NewExpressionStatement(await_assignment, await_pos), zone()); 5692 factory->NewExpressionStatement(await_assignment, await_pos), zone());
5706 Expression* do_expr = factory->NewDoExpression(do_block, temp_var, nopos); 5693 Expression* do_expr = factory->NewDoExpression(do_block, temp_var, nopos);
5707 5694
5708 generator_object = factory->NewVariableProxy(generator_object_variable); 5695 generator_object = factory->NewVariableProxy(generator_object_variable);
5709 return factory->NewYield(generator_object, do_expr, nopos, 5696 return factory->NewYield(generator_object, do_expr, nopos,
5710 Yield::kOnExceptionRethrow); 5697 Yield::kOnExceptionRethrow);
5711 } 5698 }
5712 5699
5713 ZoneList<Expression*>* ParserTraits::GetNonPatternList() const { 5700 ZoneList<Expression*>* ParserBaseTraits<Parser>::GetNonPatternList() const {
5714 return parser_->function_state_->non_patterns_to_rewrite(); 5701 return delegate()->function_state_->non_patterns_to_rewrite();
5715 } 5702 }
5716 5703
5717 5704 ZoneList<typename ParserBaseTraits<Parser>::Type::ExpressionClassifier::Error>*
5718 ZoneList<typename ParserTraits::Type::ExpressionClassifier::Error>* 5705 ParserBaseTraits<Parser>::GetReportedErrorList() const {
5719 ParserTraits::GetReportedErrorList() const { 5706 return delegate()->function_state_->GetReportedErrorList();
5720 return parser_->function_state_->GetReportedErrorList();
5721 } 5707 }
5722 5708
5723 Zone* ParserTraits::zone() const { return parser_->zone(); } 5709 Zone* ParserBaseTraits<Parser>::zone() const { return delegate()->zone(); }
5724 5710
5725 class NonPatternRewriter : public AstExpressionRewriter { 5711 class NonPatternRewriter : public AstExpressionRewriter {
5726 public: 5712 public:
5727 NonPatternRewriter(uintptr_t stack_limit, Parser* parser) 5713 NonPatternRewriter(uintptr_t stack_limit, Parser* parser)
5728 : AstExpressionRewriter(stack_limit), parser_(parser) {} 5714 : AstExpressionRewriter(stack_limit), parser_(parser) {}
5729 ~NonPatternRewriter() override {} 5715 ~NonPatternRewriter() override {}
5730 5716
5731 private: 5717 private:
5732 bool RewriteExpression(Expression* expr) override { 5718 bool RewriteExpression(Expression* expr) override {
5733 if (expr->IsRewritableExpression()) return true; 5719 if (expr->IsRewritableExpression()) return true;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
5913 append_body, finalize); 5899 append_body, finalize);
5914 do_block->statements()->Add(loop, zone()); 5900 do_block->statements()->Add(loop, zone());
5915 } 5901 }
5916 } 5902 }
5917 // Now, rewind the original array literal to truncate everything from the 5903 // Now, rewind the original array literal to truncate everything from the
5918 // first spread (included) until the end. This fixes $R's initialization. 5904 // first spread (included) until the end. This fixes $R's initialization.
5919 lit->RewindSpreads(); 5905 lit->RewindSpreads();
5920 return factory()->NewDoExpression(do_block, result, lit->position()); 5906 return factory()->NewDoExpression(do_block, result, lit->position());
5921 } 5907 }
5922 5908
5923 5909 void ParserBaseTraits<Parser>::QueueDestructuringAssignmentForRewriting(
5924 void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) { 5910 Expression* expr) {
5925 DCHECK(expr->IsRewritableExpression()); 5911 DCHECK(expr->IsRewritableExpression());
5926 parser_->function_state_->AddDestructuringAssignment( 5912 delegate()->function_state_->AddDestructuringAssignment(
5927 Parser::DestructuringAssignment(expr, parser_->scope())); 5913 Parser::DestructuringAssignment(expr, delegate()->scope()));
5928 } 5914 }
5929 5915
5930 5916 void ParserBaseTraits<Parser>::QueueNonPatternForRewriting(Expression* expr,
5931 void ParserTraits::QueueNonPatternForRewriting(Expression* expr, bool* ok) { 5917 bool* ok) {
5932 DCHECK(expr->IsRewritableExpression()); 5918 DCHECK(expr->IsRewritableExpression());
5933 parser_->function_state_->AddNonPatternForRewriting(expr, ok); 5919 delegate()->function_state_->AddNonPatternForRewriting(expr, ok);
5934 } 5920 }
5935 5921
5936 5922 void ParserBaseTraits<Parser>::SetFunctionNameFromPropertyName(
5937 void ParserTraits::SetFunctionNameFromPropertyName(
5938 ObjectLiteralProperty* property, const AstRawString* name) { 5923 ObjectLiteralProperty* property, const AstRawString* name) {
5939 Expression* value = property->value(); 5924 Expression* value = property->value();
5940 5925
5941 // Computed name setting must happen at runtime. 5926 // Computed name setting must happen at runtime.
5942 if (property->is_computed_name()) return; 5927 if (property->is_computed_name()) return;
5943 5928
5944 // Getter and setter names are handled here because their names 5929 // Getter and setter names are handled here because their names
5945 // change in ES2015, even though they are not anonymous. 5930 // change in ES2015, even though they are not anonymous.
5946 auto function = value->AsFunctionLiteral(); 5931 auto function = value->AsFunctionLiteral();
5947 if (function != nullptr) { 5932 if (function != nullptr) {
5948 bool is_getter = property->kind() == ObjectLiteralProperty::GETTER; 5933 bool is_getter = property->kind() == ObjectLiteralProperty::GETTER;
5949 bool is_setter = property->kind() == ObjectLiteralProperty::SETTER; 5934 bool is_setter = property->kind() == ObjectLiteralProperty::SETTER;
5950 if (is_getter || is_setter) { 5935 if (is_getter || is_setter) {
5951 DCHECK_NOT_NULL(name); 5936 DCHECK_NOT_NULL(name);
5952 const AstRawString* prefix = 5937 const AstRawString* prefix =
5953 is_getter ? parser_->ast_value_factory()->get_space_string() 5938 is_getter ? delegate()->ast_value_factory()->get_space_string()
5954 : parser_->ast_value_factory()->set_space_string(); 5939 : delegate()->ast_value_factory()->set_space_string();
5955 function->set_raw_name( 5940 function->set_raw_name(
5956 parser_->ast_value_factory()->NewConsString(prefix, name)); 5941 delegate()->ast_value_factory()->NewConsString(prefix, name));
5957 return; 5942 return;
5958 } 5943 }
5959 } 5944 }
5960 5945
5961 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] 5946 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]]
5962 // of an object literal. 5947 // of an object literal.
5963 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; 5948 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return;
5964 5949
5965 DCHECK(!value->IsAnonymousFunctionDefinition() || 5950 DCHECK(!value->IsAnonymousFunctionDefinition() ||
5966 property->kind() == ObjectLiteralProperty::COMPUTED); 5951 property->kind() == ObjectLiteralProperty::COMPUTED);
5967 parser_->SetFunctionName(value, name); 5952 delegate()->SetFunctionName(value, name);
5968 } 5953 }
5969 5954
5970 5955 void ParserBaseTraits<Parser>::SetFunctionNameFromIdentifierRef(
5971 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, 5956 Expression* value, Expression* identifier) {
5972 Expression* identifier) {
5973 if (!identifier->IsVariableProxy()) return; 5957 if (!identifier->IsVariableProxy()) return;
5974 parser_->SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); 5958 delegate()->SetFunctionName(value, identifier->AsVariableProxy()->raw_name());
5975 } 5959 }
5976 5960
5977 void Parser::SetFunctionName(Expression* value, const AstRawString* name) { 5961 void Parser::SetFunctionName(Expression* value, const AstRawString* name) {
5978 DCHECK_NOT_NULL(name); 5962 DCHECK_NOT_NULL(name);
5979 if (!value->IsAnonymousFunctionDefinition()) return; 5963 if (!value->IsAnonymousFunctionDefinition()) return;
5980 auto function = value->AsFunctionLiteral(); 5964 auto function = value->AsFunctionLiteral();
5981 if (function != nullptr) { 5965 if (function != nullptr) {
5982 function->set_raw_name(name); 5966 function->set_raw_name(name);
5983 } else { 5967 } else {
5984 DCHECK(value->IsDoExpression()); 5968 DCHECK(value->IsDoExpression());
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after
6917 node->Print(Isolate::Current()); 6901 node->Print(Isolate::Current());
6918 } 6902 }
6919 #endif // DEBUG 6903 #endif // DEBUG
6920 6904
6921 #undef CHECK_OK 6905 #undef CHECK_OK
6922 #undef CHECK_OK_VOID 6906 #undef CHECK_OK_VOID
6923 #undef CHECK_FAILED 6907 #undef CHECK_FAILED
6924 6908
6925 } // namespace internal 6909 } // namespace internal
6926 } // namespace v8 6910 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698