| OLD | NEW |
| 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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 has_dot); | 360 has_dot); |
| 361 return true; | 361 return true; |
| 362 } | 362 } |
| 363 default: | 363 default: |
| 364 break; | 364 break; |
| 365 } | 365 } |
| 366 } | 366 } |
| 367 return false; | 367 return false; |
| 368 } | 368 } |
| 369 | 369 |
| 370 Expression* ParserBaseTraits<Parser>::BuildUnaryExpression( | 370 Expression* Parser::BuildUnaryExpression(Expression* expression, |
| 371 Expression* expression, Token::Value op, int pos, AstNodeFactory* factory) { | 371 Token::Value op, int pos) { |
| 372 DCHECK(expression != NULL); | 372 DCHECK(expression != NULL); |
| 373 if (expression->IsLiteral()) { | 373 if (expression->IsLiteral()) { |
| 374 const AstValue* literal = expression->AsLiteral()->raw_value(); | 374 const AstValue* literal = expression->AsLiteral()->raw_value(); |
| 375 if (op == Token::NOT) { | 375 if (op == Token::NOT) { |
| 376 // Convert the literal to a boolean condition and negate it. | 376 // Convert the literal to a boolean condition and negate it. |
| 377 bool condition = literal->BooleanValue(); | 377 bool condition = literal->BooleanValue(); |
| 378 return factory->NewBooleanLiteral(!condition, pos); | 378 return factory()->NewBooleanLiteral(!condition, pos); |
| 379 } else if (literal->IsNumber()) { | 379 } else if (literal->IsNumber()) { |
| 380 // Compute some expressions involving only number literals. | 380 // Compute some expressions involving only number literals. |
| 381 double value = literal->AsNumber(); | 381 double value = literal->AsNumber(); |
| 382 bool has_dot = literal->ContainsDot(); | 382 bool has_dot = literal->ContainsDot(); |
| 383 switch (op) { | 383 switch (op) { |
| 384 case Token::ADD: | 384 case Token::ADD: |
| 385 return expression; | 385 return expression; |
| 386 case Token::SUB: | 386 case Token::SUB: |
| 387 return factory->NewNumberLiteral(-value, pos, has_dot); | 387 return factory()->NewNumberLiteral(-value, pos, has_dot); |
| 388 case Token::BIT_NOT: | 388 case Token::BIT_NOT: |
| 389 return factory->NewNumberLiteral(~DoubleToInt32(value), pos, has_dot); | 389 return factory()->NewNumberLiteral(~DoubleToInt32(value), pos, |
| 390 has_dot); |
| 390 default: | 391 default: |
| 391 break; | 392 break; |
| 392 } | 393 } |
| 393 } | 394 } |
| 394 } | 395 } |
| 395 // Desugar '+foo' => 'foo*1' | 396 // Desugar '+foo' => 'foo*1' |
| 396 if (op == Token::ADD) { | 397 if (op == Token::ADD) { |
| 397 return factory->NewBinaryOperation( | 398 return factory()->NewBinaryOperation( |
| 398 Token::MUL, expression, factory->NewNumberLiteral(1, pos, true), pos); | 399 Token::MUL, expression, factory()->NewNumberLiteral(1, pos, true), pos); |
| 399 } | 400 } |
| 400 // The same idea for '-foo' => 'foo*(-1)'. | 401 // The same idea for '-foo' => 'foo*(-1)'. |
| 401 if (op == Token::SUB) { | 402 if (op == Token::SUB) { |
| 402 return factory->NewBinaryOperation( | 403 return factory()->NewBinaryOperation( |
| 403 Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos); | 404 Token::MUL, expression, factory()->NewNumberLiteral(-1, pos), pos); |
| 404 } | 405 } |
| 405 // ...and one more time for '~foo' => 'foo^(~0)'. | 406 // ...and one more time for '~foo' => 'foo^(~0)'. |
| 406 if (op == Token::BIT_NOT) { | 407 if (op == Token::BIT_NOT) { |
| 407 return factory->NewBinaryOperation( | 408 return factory()->NewBinaryOperation( |
| 408 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); | 409 Token::BIT_XOR, expression, factory()->NewNumberLiteral(~0, pos), pos); |
| 409 } | 410 } |
| 410 return factory->NewUnaryOperation(op, expression, pos); | 411 return factory()->NewUnaryOperation(op, expression, pos); |
| 411 } | 412 } |
| 412 | 413 |
| 413 Expression* ParserBaseTraits<Parser>::BuildIteratorResult(Expression* value, | 414 Expression* Parser::BuildIteratorResult(Expression* value, bool done) { |
| 414 bool done) { | |
| 415 int pos = kNoSourcePosition; | 415 int pos = kNoSourcePosition; |
| 416 AstNodeFactory* factory = delegate()->factory(); | |
| 417 Zone* zone = delegate()->zone(); | |
| 418 | 416 |
| 419 if (value == nullptr) value = factory->NewUndefinedLiteral(pos); | 417 if (value == nullptr) value = factory()->NewUndefinedLiteral(pos); |
| 420 | 418 |
| 421 auto args = new (zone) ZoneList<Expression*>(2, zone); | 419 auto args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 422 args->Add(value, zone); | 420 args->Add(value, zone()); |
| 423 args->Add(factory->NewBooleanLiteral(done, pos), zone); | 421 args->Add(factory()->NewBooleanLiteral(done, pos), zone()); |
| 424 | 422 |
| 425 return factory->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args, | 423 return factory()->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args, |
| 426 pos); | 424 pos); |
| 427 } | |
| 428 | |
| 429 Expression* ParserBaseTraits<Parser>::NewThrowReferenceError( | |
| 430 MessageTemplate::Template message, int pos) { | |
| 431 return delegate()->NewThrowError( | |
| 432 Runtime::kNewReferenceError, message, | |
| 433 delegate()->ast_value_factory()->empty_string(), pos); | |
| 434 } | |
| 435 | |
| 436 Expression* ParserBaseTraits<Parser>::NewThrowSyntaxError( | |
| 437 MessageTemplate::Template message, const AstRawString* arg, int pos) { | |
| 438 return delegate()->NewThrowError(Runtime::kNewSyntaxError, message, arg, pos); | |
| 439 } | |
| 440 | |
| 441 Expression* ParserBaseTraits<Parser>::NewThrowTypeError( | |
| 442 MessageTemplate::Template message, const AstRawString* arg, int pos) { | |
| 443 return delegate()->NewThrowError(Runtime::kNewTypeError, message, arg, pos); | |
| 444 } | 425 } |
| 445 | 426 |
| 446 Expression* Parser::NewThrowError(Runtime::FunctionId id, | 427 Expression* Parser::NewThrowError(Runtime::FunctionId id, |
| 447 MessageTemplate::Template message, | 428 MessageTemplate::Template message, |
| 448 const AstRawString* arg, int pos) { | 429 const AstRawString* arg, int pos) { |
| 449 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 430 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 450 args->Add(factory()->NewSmiLiteral(message, pos), zone()); | 431 args->Add(factory()->NewSmiLiteral(message, pos), zone()); |
| 451 args->Add(factory()->NewStringLiteral(arg, pos), zone()); | 432 args->Add(factory()->NewStringLiteral(arg, pos), zone()); |
| 452 CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos); | 433 CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos); |
| 453 return factory()->NewThrow(call_constructor, pos); | 434 return factory()->NewThrow(call_constructor, pos); |
| 454 } | 435 } |
| 455 | 436 |
| 456 void ParserBaseTraits<Parser>::ReportMessageAt( | |
| 457 Scanner::Location source_location, MessageTemplate::Template message, | |
| 458 const char* arg, ParseErrorType error_type) { | |
| 459 if (delegate()->stack_overflow()) { | |
| 460 // Suppress the error message (syntax error or such) in the presence of a | |
| 461 // stack overflow. The isolate allows only one pending exception at at time | |
| 462 // and we want to report the stack overflow later. | |
| 463 return; | |
| 464 } | |
| 465 delegate()->pending_error_handler_.ReportMessageAt(source_location.beg_pos, | |
| 466 source_location.end_pos, | |
| 467 message, arg, error_type); | |
| 468 } | |
| 469 | |
| 470 void ParserBaseTraits<Parser>::ReportMessageAt( | |
| 471 Scanner::Location source_location, MessageTemplate::Template message, | |
| 472 const AstRawString* arg, ParseErrorType error_type) { | |
| 473 if (delegate()->stack_overflow()) { | |
| 474 // Suppress the error message (syntax error or such) in the presence of a | |
| 475 // stack overflow. The isolate allows only one pending exception at at time | |
| 476 // and we want to report the stack overflow later. | |
| 477 return; | |
| 478 } | |
| 479 delegate()->pending_error_handler_.ReportMessageAt(source_location.beg_pos, | |
| 480 source_location.end_pos, | |
| 481 message, arg, error_type); | |
| 482 } | |
| 483 | |
| 484 const AstRawString* ParserBaseTraits<Parser>::GetSymbol( | 437 const AstRawString* ParserBaseTraits<Parser>::GetSymbol( |
| 485 Scanner* scanner) const { | 438 Scanner* scanner) const { |
| 486 const AstRawString* result = | 439 const AstRawString* result = |
| 487 delegate()->scanner()->CurrentSymbol(delegate()->ast_value_factory()); | 440 delegate()->scanner()->CurrentSymbol(delegate()->ast_value_factory()); |
| 488 DCHECK(result != NULL); | 441 DCHECK(result != NULL); |
| 489 return result; | 442 return result; |
| 490 } | 443 } |
| 491 | 444 |
| 492 const AstRawString* ParserBaseTraits<Parser>::GetNumberAsSymbol( | 445 const AstRawString* ParserBaseTraits<Parser>::GetNumberAsSymbol( |
| 493 Scanner* scanner) const { | 446 Scanner* scanner) const { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 int pos) { | 552 int pos) { |
| 600 Expression* iterator_symbol_literal = | 553 Expression* iterator_symbol_literal = |
| 601 factory->NewSymbolLiteral("iterator_symbol", kNoSourcePosition); | 554 factory->NewSymbolLiteral("iterator_symbol", kNoSourcePosition); |
| 602 Expression* prop = | 555 Expression* prop = |
| 603 factory->NewProperty(iterable, iterator_symbol_literal, pos); | 556 factory->NewProperty(iterable, iterator_symbol_literal, pos); |
| 604 Zone* zone = delegate()->zone(); | 557 Zone* zone = delegate()->zone(); |
| 605 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone); | 558 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone); |
| 606 return factory->NewCall(prop, args, pos); | 559 return factory->NewCall(prop, args, pos); |
| 607 } | 560 } |
| 608 | 561 |
| 609 Literal* ParserBaseTraits<Parser>::GetLiteralTheHole( | |
| 610 int position, AstNodeFactory* factory) const { | |
| 611 return factory->NewTheHoleLiteral(kNoSourcePosition); | |
| 612 } | |
| 613 | |
| 614 void Parser::MarkTailPosition(Expression* expression) { | 562 void Parser::MarkTailPosition(Expression* expression) { |
| 615 expression->MarkTail(); | 563 expression->MarkTail(); |
| 616 } | 564 } |
| 617 | 565 |
| 618 Parser::Parser(ParseInfo* info) | 566 Parser::Parser(ParseInfo* info) |
| 619 : ParserBase<Parser>(info->zone(), &scanner_, info->stack_limit(), | 567 : ParserBase<Parser>(info->zone(), &scanner_, info->stack_limit(), |
| 620 info->extension(), info->ast_value_factory(), NULL), | 568 info->extension(), info->ast_value_factory(), NULL), |
| 621 scanner_(info->unicode_cache()), | 569 scanner_(info->unicode_cache()), |
| 622 reusable_preparser_(NULL), | 570 reusable_preparser_(NULL), |
| 623 original_scope_(NULL), | 571 original_scope_(NULL), |
| (...skipping 3336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3960 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, | 3908 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| 3961 const Scope::Snapshot& scope_snapshot, bool* ok) { | 3909 const Scope::Snapshot& scope_snapshot, bool* ok) { |
| 3962 if (expr->IsEmptyParentheses()) return; | 3910 if (expr->IsEmptyParentheses()) return; |
| 3963 | 3911 |
| 3964 delegate()->ParseArrowFunctionFormalParameters( | 3912 delegate()->ParseArrowFunctionFormalParameters( |
| 3965 parameters, expr, params_loc.end_pos, CHECK_OK_VOID); | 3913 parameters, expr, params_loc.end_pos, CHECK_OK_VOID); |
| 3966 | 3914 |
| 3967 scope_snapshot.Reparent(parameters->scope); | 3915 scope_snapshot.Reparent(parameters->scope); |
| 3968 | 3916 |
| 3969 if (parameters->Arity() > Code::kMaxArguments) { | 3917 if (parameters->Arity() > Code::kMaxArguments) { |
| 3970 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); | 3918 delegate()->ReportMessageAt(params_loc, |
| 3919 MessageTemplate::kMalformedArrowFunParamList); |
| 3971 *ok = false; | 3920 *ok = false; |
| 3972 return; | 3921 return; |
| 3973 } | 3922 } |
| 3974 | 3923 |
| 3975 Type::ExpressionClassifier classifier(delegate()); | 3924 Type::ExpressionClassifier classifier(delegate()); |
| 3976 if (!parameters->is_simple) { | 3925 if (!parameters->is_simple) { |
| 3977 classifier.RecordNonSimpleParameter(); | 3926 classifier.RecordNonSimpleParameter(); |
| 3978 } | 3927 } |
| 3979 for (int i = 0; i < parameters->Arity(); ++i) { | 3928 for (int i = 0; i < parameters->Arity(); ++i) { |
| 3980 auto parameter = parameters->at(i); | 3929 auto parameter = parameters->at(i); |
| (...skipping 2795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6776 node->Print(Isolate::Current()); | 6725 node->Print(Isolate::Current()); |
| 6777 } | 6726 } |
| 6778 #endif // DEBUG | 6727 #endif // DEBUG |
| 6779 | 6728 |
| 6780 #undef CHECK_OK | 6729 #undef CHECK_OK |
| 6781 #undef CHECK_OK_VOID | 6730 #undef CHECK_OK_VOID |
| 6782 #undef CHECK_FAILED | 6731 #undef CHECK_FAILED |
| 6783 | 6732 |
| 6784 } // namespace internal | 6733 } // namespace internal |
| 6785 } // namespace v8 | 6734 } // namespace v8 |
| OLD | NEW |