| 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.h" | 10 #include "src/ast/ast.h" |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 #define DUMMY ) // to make indentation work | 382 #define DUMMY ) // to make indentation work |
| 383 #undef DUMMY | 383 #undef DUMMY |
| 384 | 384 |
| 385 // ---------------------------------------------------------------------------- | 385 // ---------------------------------------------------------------------------- |
| 386 // Implementation of Parser | 386 // Implementation of Parser |
| 387 | 387 |
| 388 bool ParserTraits::IsEval(const AstRawString* identifier) const { | 388 bool ParserTraits::IsEval(const AstRawString* identifier) const { |
| 389 return identifier == parser_->ast_value_factory()->eval_string(); | 389 return identifier == parser_->ast_value_factory()->eval_string(); |
| 390 } | 390 } |
| 391 | 391 |
| 392 | |
| 393 bool ParserTraits::IsArguments(const AstRawString* identifier) const { | 392 bool ParserTraits::IsArguments(const AstRawString* identifier) const { |
| 394 return identifier == parser_->ast_value_factory()->arguments_string(); | 393 return identifier == parser_->ast_value_factory()->arguments_string(); |
| 395 } | 394 } |
| 396 | 395 |
| 397 | |
| 398 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { | 396 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { |
| 399 return IsEval(identifier) || IsArguments(identifier); | 397 return IsEval(identifier) || IsArguments(identifier); |
| 400 } | 398 } |
| 401 | 399 |
| 402 bool ParserTraits::IsUndefined(const AstRawString* identifier) const { | 400 bool ParserTraits::IsUndefined(const AstRawString* identifier) const { |
| 403 return identifier == parser_->ast_value_factory()->undefined_string(); | 401 return identifier == parser_->ast_value_factory()->undefined_string(); |
| 404 } | 402 } |
| 405 | 403 |
| 406 bool ParserTraits::IsAwait(const AstRawString* identifier) const { | 404 bool ParserTraits::IsAwait(const AstRawString* identifier) const { |
| 407 return identifier == parser_->ast_value_factory()->await_string(); | 405 return identifier == parser_->ast_value_factory()->await_string(); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 auto args = new (zone) ZoneList<Expression*>(2, zone); | 582 auto args = new (zone) ZoneList<Expression*>(2, zone); |
| 585 args->Add(value, zone); | 583 args->Add(value, zone); |
| 586 args->Add(factory->NewBooleanLiteral(done, pos), zone); | 584 args->Add(factory->NewBooleanLiteral(done, pos), zone); |
| 587 | 585 |
| 588 return factory->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args, | 586 return factory->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args, |
| 589 pos); | 587 pos); |
| 590 } | 588 } |
| 591 | 589 |
| 592 Expression* ParserTraits::NewThrowReferenceError( | 590 Expression* ParserTraits::NewThrowReferenceError( |
| 593 MessageTemplate::Template message, int pos) { | 591 MessageTemplate::Template message, int pos) { |
| 594 return NewThrowError(Runtime::kNewReferenceError, message, | 592 return parser_->NewThrowError(Runtime::kNewReferenceError, message, |
| 595 parser_->ast_value_factory()->empty_string(), pos); | 593 parser_->ast_value_factory()->empty_string(), |
| 594 pos); |
| 596 } | 595 } |
| 597 | 596 |
| 598 | 597 |
| 599 Expression* ParserTraits::NewThrowSyntaxError(MessageTemplate::Template message, | 598 Expression* ParserTraits::NewThrowSyntaxError(MessageTemplate::Template message, |
| 600 const AstRawString* arg, | 599 const AstRawString* arg, |
| 601 int pos) { | 600 int pos) { |
| 602 return NewThrowError(Runtime::kNewSyntaxError, message, arg, pos); | 601 return parser_->NewThrowError(Runtime::kNewSyntaxError, message, arg, pos); |
| 603 } | 602 } |
| 604 | 603 |
| 605 | 604 |
| 606 Expression* ParserTraits::NewThrowTypeError(MessageTemplate::Template message, | 605 Expression* ParserTraits::NewThrowTypeError(MessageTemplate::Template message, |
| 607 const AstRawString* arg, int pos) { | 606 const AstRawString* arg, int pos) { |
| 608 return NewThrowError(Runtime::kNewTypeError, message, arg, pos); | 607 return parser_->NewThrowError(Runtime::kNewTypeError, message, arg, pos); |
| 608 } |
| 609 |
| 610 Expression* Parser::NewThrowError(Runtime::FunctionId id, |
| 611 MessageTemplate::Template message, |
| 612 const AstRawString* arg, int pos) { |
| 613 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 614 args->Add(factory()->NewSmiLiteral(message, pos), zone()); |
| 615 args->Add(factory()->NewStringLiteral(arg, pos), zone()); |
| 616 CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos); |
| 617 return factory()->NewThrow(call_constructor, pos); |
| 609 } | 618 } |
| 610 | 619 |
| 611 | 620 |
| 612 Expression* ParserTraits::NewThrowError(Runtime::FunctionId id, | |
| 613 MessageTemplate::Template message, | |
| 614 const AstRawString* arg, int pos) { | |
| 615 Zone* zone = parser_->zone(); | |
| 616 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); | |
| 617 args->Add(parser_->factory()->NewSmiLiteral(message, pos), zone); | |
| 618 args->Add(parser_->factory()->NewStringLiteral(arg, pos), zone); | |
| 619 CallRuntime* call_constructor = | |
| 620 parser_->factory()->NewCallRuntime(id, args, pos); | |
| 621 return parser_->factory()->NewThrow(call_constructor, pos); | |
| 622 } | |
| 623 | |
| 624 | |
| 625 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 621 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
| 626 MessageTemplate::Template message, | 622 MessageTemplate::Template message, |
| 627 const char* arg, ParseErrorType error_type) { | 623 const char* arg, ParseErrorType error_type) { |
| 628 if (parser_->stack_overflow()) { | 624 if (parser_->stack_overflow()) { |
| 629 // Suppress the error message (syntax error or such) in the presence of a | 625 // Suppress the error message (syntax error or such) in the presence of a |
| 630 // stack overflow. The isolate allows only one pending exception at at time | 626 // stack overflow. The isolate allows only one pending exception at at time |
| 631 // and we want to report the stack overflow later. | 627 // and we want to report the stack overflow later. |
| 632 return; | 628 return; |
| 633 } | 629 } |
| 634 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, | 630 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, |
| 635 source_location.end_pos, | 631 source_location.end_pos, |
| 636 message, arg, error_type); | 632 message, arg, error_type); |
| 637 } | 633 } |
| 638 | 634 |
| 639 | 635 |
| 640 void ParserTraits::ReportMessage(MessageTemplate::Template message, | |
| 641 const char* arg, ParseErrorType error_type) { | |
| 642 Scanner::Location source_location = parser_->scanner()->location(); | |
| 643 ReportMessageAt(source_location, message, arg, error_type); | |
| 644 } | |
| 645 | |
| 646 | |
| 647 void ParserTraits::ReportMessage(MessageTemplate::Template message, | |
| 648 const AstRawString* arg, | |
| 649 ParseErrorType error_type) { | |
| 650 Scanner::Location source_location = parser_->scanner()->location(); | |
| 651 ReportMessageAt(source_location, message, arg, error_type); | |
| 652 } | |
| 653 | |
| 654 | |
| 655 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 636 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
| 656 MessageTemplate::Template message, | 637 MessageTemplate::Template message, |
| 657 const AstRawString* arg, | 638 const AstRawString* arg, |
| 658 ParseErrorType error_type) { | 639 ParseErrorType error_type) { |
| 659 if (parser_->stack_overflow()) { | 640 if (parser_->stack_overflow()) { |
| 660 // Suppress the error message (syntax error or such) in the presence of a | 641 // Suppress the error message (syntax error or such) in the presence of a |
| 661 // stack overflow. The isolate allows only one pending exception at at time | 642 // stack overflow. The isolate allows only one pending exception at at time |
| 662 // and we want to report the stack overflow later. | 643 // and we want to report the stack overflow later. |
| 663 return; | 644 return; |
| 664 } | 645 } |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 if (use_strict_found) { | 1291 if (use_strict_found) { |
| 1311 if (is_sloppy(language_mode())) { | 1292 if (is_sloppy(language_mode())) { |
| 1312 RaiseLanguageMode(STRICT); | 1293 RaiseLanguageMode(STRICT); |
| 1313 } | 1294 } |
| 1314 | 1295 |
| 1315 if (!this->scope()->HasSimpleParameters()) { | 1296 if (!this->scope()->HasSimpleParameters()) { |
| 1316 // TC39 deemed "use strict" directives to be an error when occurring | 1297 // TC39 deemed "use strict" directives to be an error when occurring |
| 1317 // in the body of a function with non-simple parameter list, on | 1298 // in the body of a function with non-simple parameter list, on |
| 1318 // 29/7/2015. https://goo.gl/ueA7Ln | 1299 // 29/7/2015. https://goo.gl/ueA7Ln |
| 1319 const AstRawString* string = literal->raw_value()->AsString(); | 1300 const AstRawString* string = literal->raw_value()->AsString(); |
| 1320 ParserTraits::ReportMessageAt( | 1301 ReportMessageAt(token_loc, |
| 1321 token_loc, MessageTemplate::kIllegalLanguageModeDirective, | 1302 MessageTemplate::kIllegalLanguageModeDirective, |
| 1322 string); | 1303 string); |
| 1323 *ok = false; | 1304 *ok = false; |
| 1324 return; | 1305 return; |
| 1325 } | 1306 } |
| 1326 // Because declarations in strict eval code don't leak into the scope | 1307 // Because declarations in strict eval code don't leak into the scope |
| 1327 // of the eval call, it is likely that functions declared in strict | 1308 // of the eval call, it is likely that functions declared in strict |
| 1328 // eval code will be used within the eval code, so lazy parsing is | 1309 // eval code will be used within the eval code, so lazy parsing is |
| 1329 // probably not a win. | 1310 // probably not a win. |
| 1330 if (this->scope()->is_eval_scope()) mode_ = PARSE_EAGERLY; | 1311 if (this->scope()->is_eval_scope()) mode_ = PARSE_EAGERLY; |
| 1331 } else if (literal->raw_value()->AsString() == | 1312 } else if (literal->raw_value()->AsString() == |
| 1332 ast_value_factory()->use_asm_string() && | 1313 ast_value_factory()->use_asm_string() && |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2062 // check also covers the special case | 2043 // check also covers the special case |
| 2063 // | 2044 // |
| 2064 // function () { let x; { var x; } } | 2045 // function () { let x; { var x; } } |
| 2065 // | 2046 // |
| 2066 // because the var declaration is hoisted to the function scope where | 2047 // because the var declaration is hoisted to the function scope where |
| 2067 // 'x' is already bound. | 2048 // 'x' is already bound. |
| 2068 DCHECK(IsDeclaredVariableMode(var->mode())); | 2049 DCHECK(IsDeclaredVariableMode(var->mode())); |
| 2069 // In harmony we treat re-declarations as early errors. See | 2050 // In harmony we treat re-declarations as early errors. See |
| 2070 // ES5 16 for a definition of early errors. | 2051 // ES5 16 for a definition of early errors. |
| 2071 if (declaration_kind == DeclarationDescriptor::NORMAL) { | 2052 if (declaration_kind == DeclarationDescriptor::NORMAL) { |
| 2072 ParserTraits::ReportMessage(MessageTemplate::kVarRedeclaration, name); | 2053 ReportMessage(MessageTemplate::kVarRedeclaration, name); |
| 2073 } else { | 2054 } else { |
| 2074 ParserTraits::ReportMessage(MessageTemplate::kParamDupe); | 2055 ReportMessage(MessageTemplate::kParamDupe); |
| 2075 } | 2056 } |
| 2076 *ok = false; | 2057 *ok = false; |
| 2077 return nullptr; | 2058 return nullptr; |
| 2078 } | 2059 } |
| 2079 } else if (mode == VAR) { | 2060 } else if (mode == VAR) { |
| 2080 var->set_maybe_assigned(); | 2061 var->set_maybe_assigned(); |
| 2081 } | 2062 } |
| 2082 } | 2063 } |
| 2083 DCHECK_NOT_NULL(var); | 2064 DCHECK_NOT_NULL(var); |
| 2084 | 2065 |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2457 | 2438 |
| 2458 // End position of the initializer is after the assignment expression. | 2439 // End position of the initializer is after the assignment expression. |
| 2459 initializer_position = scanner()->location().end_pos; | 2440 initializer_position = scanner()->location().end_pos; |
| 2460 } else { | 2441 } else { |
| 2461 // Initializers may be either required or implied unless this is a | 2442 // Initializers may be either required or implied unless this is a |
| 2462 // for-in/of iteration variable. | 2443 // for-in/of iteration variable. |
| 2463 if (var_context != kForStatement || !PeekInOrOf()) { | 2444 if (var_context != kForStatement || !PeekInOrOf()) { |
| 2464 // ES6 'const' and binding patterns require initializers. | 2445 // ES6 'const' and binding patterns require initializers. |
| 2465 if (parsing_result->descriptor.mode == CONST || | 2446 if (parsing_result->descriptor.mode == CONST || |
| 2466 !pattern->IsVariableProxy()) { | 2447 !pattern->IsVariableProxy()) { |
| 2467 ParserTraits::ReportMessageAt( | 2448 ReportMessageAt( |
| 2468 Scanner::Location(decl_pos, scanner()->location().end_pos), | 2449 Scanner::Location(decl_pos, scanner()->location().end_pos), |
| 2469 MessageTemplate::kDeclarationMissingInitializer, | 2450 MessageTemplate::kDeclarationMissingInitializer, |
| 2470 !pattern->IsVariableProxy() ? "destructuring" : "const"); | 2451 !pattern->IsVariableProxy() ? "destructuring" : "const"); |
| 2471 *ok = false; | 2452 *ok = false; |
| 2472 return nullptr; | 2453 return nullptr; |
| 2473 } | 2454 } |
| 2474 | 2455 |
| 2475 // 'let x' initializes 'x' to undefined. | 2456 // 'let x' initializes 'x' to undefined. |
| 2476 if (parsing_result->descriptor.mode == LET) { | 2457 if (parsing_result->descriptor.mode == LET) { |
| 2477 value = GetLiteralUndefined(position()); | 2458 value = GetLiteralUndefined(position()); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2520 return false; | 2501 return false; |
| 2521 } | 2502 } |
| 2522 | 2503 |
| 2523 Statement* Parser::ParseFunctionDeclaration(bool* ok) { | 2504 Statement* Parser::ParseFunctionDeclaration(bool* ok) { |
| 2524 Consume(Token::FUNCTION); | 2505 Consume(Token::FUNCTION); |
| 2525 int pos = position(); | 2506 int pos = position(); |
| 2526 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; | 2507 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; |
| 2527 if (Check(Token::MUL)) { | 2508 if (Check(Token::MUL)) { |
| 2528 flags |= ParseFunctionFlags::kIsGenerator; | 2509 flags |= ParseFunctionFlags::kIsGenerator; |
| 2529 if (allow_harmony_restrictive_declarations()) { | 2510 if (allow_harmony_restrictive_declarations()) { |
| 2530 ParserTraits::ReportMessageAt(scanner()->location(), | 2511 ReportMessageAt(scanner()->location(), |
| 2531 MessageTemplate::kGeneratorInLegacyContext); | 2512 MessageTemplate::kGeneratorInLegacyContext); |
| 2532 *ok = false; | 2513 *ok = false; |
| 2533 return nullptr; | 2514 return nullptr; |
| 2534 } | 2515 } |
| 2535 } | 2516 } |
| 2536 | 2517 |
| 2537 return ParseHoistableDeclaration(pos, flags, nullptr, false, CHECK_OK); | 2518 return ParseHoistableDeclaration(pos, flags, nullptr, false, CHECK_OK); |
| 2538 } | 2519 } |
| 2539 | 2520 |
| 2540 Statement* Parser::ParseExpressionOrLabelledStatement( | 2521 Statement* Parser::ParseExpressionOrLabelledStatement( |
| 2541 ZoneList<const AstRawString*>* labels, | 2522 ZoneList<const AstRawString*>* labels, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2569 // Expression is a single identifier, and not, e.g., a parenthesized | 2550 // Expression is a single identifier, and not, e.g., a parenthesized |
| 2570 // identifier. | 2551 // identifier. |
| 2571 VariableProxy* var = expr->AsVariableProxy(); | 2552 VariableProxy* var = expr->AsVariableProxy(); |
| 2572 const AstRawString* label = var->raw_name(); | 2553 const AstRawString* label = var->raw_name(); |
| 2573 // TODO(1240780): We don't check for redeclaration of labels | 2554 // TODO(1240780): We don't check for redeclaration of labels |
| 2574 // during preparsing since keeping track of the set of active | 2555 // during preparsing since keeping track of the set of active |
| 2575 // labels requires nontrivial changes to the way scopes are | 2556 // labels requires nontrivial changes to the way scopes are |
| 2576 // structured. However, these are probably changes we want to | 2557 // structured. However, these are probably changes we want to |
| 2577 // make later anyway so we should go back and fix this then. | 2558 // make later anyway so we should go back and fix this then. |
| 2578 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { | 2559 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { |
| 2579 ParserTraits::ReportMessage(MessageTemplate::kLabelRedeclaration, label); | 2560 ReportMessage(MessageTemplate::kLabelRedeclaration, label); |
| 2580 *ok = false; | 2561 *ok = false; |
| 2581 return NULL; | 2562 return NULL; |
| 2582 } | 2563 } |
| 2583 if (labels == NULL) { | 2564 if (labels == NULL) { |
| 2584 labels = new(zone()) ZoneList<const AstRawString*>(4, zone()); | 2565 labels = new(zone()) ZoneList<const AstRawString*>(4, zone()); |
| 2585 } | 2566 } |
| 2586 labels->Add(label, zone()); | 2567 labels->Add(label, zone()); |
| 2587 // Remove the "ghost" variable that turned out to be a label | 2568 // Remove the "ghost" variable that turned out to be a label |
| 2588 // from the top scope. This way, we don't try to resolve it | 2569 // from the top scope. This way, we don't try to resolve it |
| 2589 // during the scope processing. | 2570 // during the scope processing. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2654 // ECMA allows "eval" or "arguments" as labels even in strict mode. | 2635 // ECMA allows "eval" or "arguments" as labels even in strict mode. |
| 2655 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); | 2636 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| 2656 } | 2637 } |
| 2657 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); | 2638 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); |
| 2658 if (target == NULL) { | 2639 if (target == NULL) { |
| 2659 // Illegal continue statement. | 2640 // Illegal continue statement. |
| 2660 MessageTemplate::Template message = MessageTemplate::kIllegalContinue; | 2641 MessageTemplate::Template message = MessageTemplate::kIllegalContinue; |
| 2661 if (label != NULL) { | 2642 if (label != NULL) { |
| 2662 message = MessageTemplate::kUnknownLabel; | 2643 message = MessageTemplate::kUnknownLabel; |
| 2663 } | 2644 } |
| 2664 ParserTraits::ReportMessage(message, label); | 2645 ReportMessage(message, label); |
| 2665 *ok = false; | 2646 *ok = false; |
| 2666 return NULL; | 2647 return NULL; |
| 2667 } | 2648 } |
| 2668 ExpectSemicolon(CHECK_OK); | 2649 ExpectSemicolon(CHECK_OK); |
| 2669 return factory()->NewContinueStatement(target, pos); | 2650 return factory()->NewContinueStatement(target, pos); |
| 2670 } | 2651 } |
| 2671 | 2652 |
| 2672 | 2653 |
| 2673 Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels, | 2654 Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels, |
| 2674 bool* ok) { | 2655 bool* ok) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2691 return factory()->NewEmptyStatement(pos); | 2672 return factory()->NewEmptyStatement(pos); |
| 2692 } | 2673 } |
| 2693 BreakableStatement* target = NULL; | 2674 BreakableStatement* target = NULL; |
| 2694 target = LookupBreakTarget(label, CHECK_OK); | 2675 target = LookupBreakTarget(label, CHECK_OK); |
| 2695 if (target == NULL) { | 2676 if (target == NULL) { |
| 2696 // Illegal break statement. | 2677 // Illegal break statement. |
| 2697 MessageTemplate::Template message = MessageTemplate::kIllegalBreak; | 2678 MessageTemplate::Template message = MessageTemplate::kIllegalBreak; |
| 2698 if (label != NULL) { | 2679 if (label != NULL) { |
| 2699 message = MessageTemplate::kUnknownLabel; | 2680 message = MessageTemplate::kUnknownLabel; |
| 2700 } | 2681 } |
| 2701 ParserTraits::ReportMessage(message, label); | 2682 ReportMessage(message, label); |
| 2702 *ok = false; | 2683 *ok = false; |
| 2703 return NULL; | 2684 return NULL; |
| 2704 } | 2685 } |
| 2705 ExpectSemicolon(CHECK_OK); | 2686 ExpectSemicolon(CHECK_OK); |
| 2706 return factory()->NewBreakStatement(target, pos); | 2687 return factory()->NewBreakStatement(target, pos); |
| 2707 } | 2688 } |
| 2708 | 2689 |
| 2709 | 2690 |
| 2710 Statement* Parser::ParseReturnStatement(bool* ok) { | 2691 Statement* Parser::ParseReturnStatement(bool* ok) { |
| 2711 // ReturnStatement :: | 2692 // ReturnStatement :: |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3074 Declaration* decl = | 3055 Declaration* decl = |
| 3075 inner_block_scope->CheckLexDeclarationsConflictingWith( | 3056 inner_block_scope->CheckLexDeclarationsConflictingWith( |
| 3076 bound_names); | 3057 bound_names); |
| 3077 if (decl != nullptr) { | 3058 if (decl != nullptr) { |
| 3078 const AstRawString* name = decl->proxy()->raw_name(); | 3059 const AstRawString* name = decl->proxy()->raw_name(); |
| 3079 int position = decl->proxy()->position(); | 3060 int position = decl->proxy()->position(); |
| 3080 Scanner::Location location = | 3061 Scanner::Location location = |
| 3081 position == kNoSourcePosition | 3062 position == kNoSourcePosition |
| 3082 ? Scanner::Location::invalid() | 3063 ? Scanner::Location::invalid() |
| 3083 : Scanner::Location(position, position + 1); | 3064 : Scanner::Location(position, position + 1); |
| 3084 ParserTraits::ReportMessageAt( | 3065 ReportMessageAt(location, MessageTemplate::kVarRedeclaration, name); |
| 3085 location, MessageTemplate::kVarRedeclaration, name); | |
| 3086 *ok = false; | 3066 *ok = false; |
| 3087 return nullptr; | 3067 return nullptr; |
| 3088 } | 3068 } |
| 3089 } | 3069 } |
| 3090 block_state.set_end_position(scanner()->location().end_pos); | 3070 block_state.set_end_position(scanner()->location().end_pos); |
| 3091 catch_block->set_scope(block_state.FinalizedBlockScope()); | 3071 catch_block->set_scope(block_state.FinalizedBlockScope()); |
| 3092 } | 3072 } |
| 3093 } | 3073 } |
| 3094 | 3074 |
| 3095 catch_scope->set_end_position(scanner()->location().end_pos); | 3075 catch_scope->set_end_position(scanner()->location().end_pos); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3385 // Statement* body (gets overwritten) | 3365 // Statement* body (gets overwritten) |
| 3386 if (finalize) { | 3366 if (finalize) { |
| 3387 Block* block = factory()->NewBlock(nullptr, 2, false, nopos); | 3367 Block* block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 3388 block->statements()->Add(body, zone()); | 3368 block->statements()->Add(body, zone()); |
| 3389 block->statements()->Add(set_completion_normal, zone()); | 3369 block->statements()->Add(set_completion_normal, zone()); |
| 3390 body = block; | 3370 body = block; |
| 3391 } | 3371 } |
| 3392 | 3372 |
| 3393 for_of->Initialize(body, iterator, assign_iterator, next_result, result_done, | 3373 for_of->Initialize(body, iterator, assign_iterator, next_result, result_done, |
| 3394 assign_each); | 3374 assign_each); |
| 3395 return finalize | 3375 return finalize ? FinalizeForOfStatement(for_of, completion, nopos) : for_of; |
| 3396 ? ParserTraits::FinalizeForOfStatement(for_of, completion, nopos) | |
| 3397 : for_of; | |
| 3398 } | 3376 } |
| 3399 | 3377 |
| 3400 Statement* Parser::DesugarLexicalBindingsInForStatement( | 3378 Statement* Parser::DesugarLexicalBindingsInForStatement( |
| 3401 Scope* inner_scope, VariableMode mode, ZoneList<const AstRawString*>* names, | 3379 Scope* inner_scope, VariableMode mode, ZoneList<const AstRawString*>* names, |
| 3402 ForStatement* loop, Statement* init, Expression* cond, Statement* next, | 3380 ForStatement* loop, Statement* init, Expression* cond, Statement* next, |
| 3403 Statement* body, bool* ok) { | 3381 Statement* body, bool* ok) { |
| 3404 // ES6 13.7.4.8 specifies that on each loop iteration the let variables are | 3382 // ES6 13.7.4.8 specifies that on each loop iteration the let variables are |
| 3405 // copied into a new environment. Moreover, the "next" statement must be | 3383 // copied into a new environment. Moreover, the "next" statement must be |
| 3406 // evaluated not in the environment of the just completed iteration but in | 3384 // evaluated not in the environment of the just completed iteration but in |
| 3407 // that of the upcoming one. We achieve this with the following desugaring. | 3385 // that of the upcoming one. We achieve this with the following desugaring. |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3679 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, | 3657 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, |
| 3680 CHECK_OK); | 3658 CHECK_OK); |
| 3681 | 3659 |
| 3682 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; | 3660 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; |
| 3683 int each_beg_pos = scanner()->location().beg_pos; | 3661 int each_beg_pos = scanner()->location().beg_pos; |
| 3684 int each_end_pos = scanner()->location().end_pos; | 3662 int each_end_pos = scanner()->location().end_pos; |
| 3685 | 3663 |
| 3686 if (CheckInOrOf(&mode, ok)) { | 3664 if (CheckInOrOf(&mode, ok)) { |
| 3687 if (!*ok) return nullptr; | 3665 if (!*ok) return nullptr; |
| 3688 if (parsing_result.declarations.length() != 1) { | 3666 if (parsing_result.declarations.length() != 1) { |
| 3689 ParserTraits::ReportMessageAt( | 3667 ReportMessageAt(parsing_result.bindings_loc, |
| 3690 parsing_result.bindings_loc, | 3668 MessageTemplate::kForInOfLoopMultiBindings, |
| 3691 MessageTemplate::kForInOfLoopMultiBindings, | 3669 ForEachStatement::VisitModeString(mode)); |
| 3692 ForEachStatement::VisitModeString(mode)); | |
| 3693 *ok = false; | 3670 *ok = false; |
| 3694 return nullptr; | 3671 return nullptr; |
| 3695 } | 3672 } |
| 3696 DeclarationParsingResult::Declaration& decl = | 3673 DeclarationParsingResult::Declaration& decl = |
| 3697 parsing_result.declarations[0]; | 3674 parsing_result.declarations[0]; |
| 3698 if (parsing_result.first_initializer_loc.IsValid() && | 3675 if (parsing_result.first_initializer_loc.IsValid() && |
| 3699 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE || | 3676 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE || |
| 3700 IsLexicalVariableMode(parsing_result.descriptor.mode) || | 3677 IsLexicalVariableMode(parsing_result.descriptor.mode) || |
| 3701 !decl.pattern->IsVariableProxy() || allow_harmony_for_in())) { | 3678 !decl.pattern->IsVariableProxy() || allow_harmony_for_in())) { |
| 3702 // Only increment the use count if we would have let this through | 3679 // Only increment the use count if we would have let this through |
| 3703 // without the flag. | 3680 // without the flag. |
| 3704 if (allow_harmony_for_in()) { | 3681 if (allow_harmony_for_in()) { |
| 3705 ++use_counts_[v8::Isolate::kForInInitializer]; | 3682 ++use_counts_[v8::Isolate::kForInInitializer]; |
| 3706 } | 3683 } |
| 3707 ParserTraits::ReportMessageAt( | 3684 ReportMessageAt(parsing_result.first_initializer_loc, |
| 3708 parsing_result.first_initializer_loc, | 3685 MessageTemplate::kForInOfLoopInitializer, |
| 3709 MessageTemplate::kForInOfLoopInitializer, | 3686 ForEachStatement::VisitModeString(mode)); |
| 3710 ForEachStatement::VisitModeString(mode)); | |
| 3711 *ok = false; | 3687 *ok = false; |
| 3712 return nullptr; | 3688 return nullptr; |
| 3713 } | 3689 } |
| 3714 | 3690 |
| 3715 Block* init_block = nullptr; | 3691 Block* init_block = nullptr; |
| 3716 bound_names_are_lexical = | 3692 bound_names_are_lexical = |
| 3717 IsLexicalVariableMode(parsing_result.descriptor.mode); | 3693 IsLexicalVariableMode(parsing_result.descriptor.mode); |
| 3718 | 3694 |
| 3719 // special case for legacy for (var ... = ... in ...) | 3695 // special case for legacy for (var ... = ... in ...) |
| 3720 if (!bound_names_are_lexical && decl.pattern->IsVariableProxy() && | 3696 if (!bound_names_are_lexical && decl.pattern->IsVariableProxy() && |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3809 if (is_for_var_of) { | 3785 if (is_for_var_of) { |
| 3810 Scope* catch_scope = scope(); | 3786 Scope* catch_scope = scope(); |
| 3811 while (catch_scope != nullptr && | 3787 while (catch_scope != nullptr && |
| 3812 !catch_scope->is_declaration_scope()) { | 3788 !catch_scope->is_declaration_scope()) { |
| 3813 if (catch_scope->is_catch_scope()) { | 3789 if (catch_scope->is_catch_scope()) { |
| 3814 auto name = catch_scope->catch_variable_name(); | 3790 auto name = catch_scope->catch_variable_name(); |
| 3815 if (name != | 3791 if (name != |
| 3816 ast_value_factory() | 3792 ast_value_factory() |
| 3817 ->dot_catch_string()) { // i.e. is a simple binding | 3793 ->dot_catch_string()) { // i.e. is a simple binding |
| 3818 if (bound_names.Contains(name)) { | 3794 if (bound_names.Contains(name)) { |
| 3819 ParserTraits::ReportMessageAt( | 3795 ReportMessageAt(parsing_result.bindings_loc, |
| 3820 parsing_result.bindings_loc, | 3796 MessageTemplate::kVarRedeclaration, name); |
| 3821 MessageTemplate::kVarRedeclaration, name); | |
| 3822 *ok = false; | 3797 *ok = false; |
| 3823 return nullptr; | 3798 return nullptr; |
| 3824 } | 3799 } |
| 3825 } | 3800 } |
| 3826 } | 3801 } |
| 3827 catch_scope = catch_scope->outer_scope(); | 3802 catch_scope = catch_scope->outer_scope(); |
| 3828 } | 3803 } |
| 3829 } | 3804 } |
| 3830 } | 3805 } |
| 3831 | 3806 |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4059 Handle<FixedArray> value) { | 4034 Handle<FixedArray> value) { |
| 4060 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); | 4035 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); |
| 4061 return static_cast<LiteralType>(literal_type->value()); | 4036 return static_cast<LiteralType>(literal_type->value()); |
| 4062 } | 4037 } |
| 4063 | 4038 |
| 4064 | 4039 |
| 4065 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { | 4040 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
| 4066 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); | 4041 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); |
| 4067 } | 4042 } |
| 4068 | 4043 |
| 4069 void ParserTraits::ParseArrowFunctionFormalParameters( | 4044 void Parser::ParseArrowFunctionFormalParameters( |
| 4070 ParserFormalParameters* parameters, Expression* expr, int end_pos, | 4045 ParserFormalParameters* parameters, Expression* expr, int end_pos, |
| 4071 bool* ok) { | 4046 bool* ok) { |
| 4072 // ArrowFunctionFormals :: | 4047 // ArrowFunctionFormals :: |
| 4073 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) | 4048 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) |
| 4074 // Tail | 4049 // Tail |
| 4075 // NonTailArrowFunctionFormals :: | 4050 // NonTailArrowFunctionFormals :: |
| 4076 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) | 4051 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) |
| 4077 // VariableProxy | 4052 // VariableProxy |
| 4078 // Tail :: | 4053 // Tail :: |
| 4079 // VariableProxy | 4054 // VariableProxy |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4191 } | 4166 } |
| 4192 return expr; | 4167 return expr; |
| 4193 } | 4168 } |
| 4194 | 4169 |
| 4195 void ParserTraits::ParseArrowFunctionFormalParameterList( | 4170 void ParserTraits::ParseArrowFunctionFormalParameterList( |
| 4196 ParserFormalParameters* parameters, Expression* expr, | 4171 ParserFormalParameters* parameters, Expression* expr, |
| 4197 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, | 4172 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| 4198 const Scope::Snapshot& scope_snapshot, bool* ok) { | 4173 const Scope::Snapshot& scope_snapshot, bool* ok) { |
| 4199 if (expr->IsEmptyParentheses()) return; | 4174 if (expr->IsEmptyParentheses()) return; |
| 4200 | 4175 |
| 4201 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos, | 4176 parser_->ParseArrowFunctionFormalParameters( |
| 4202 CHECK_OK_VOID); | 4177 parameters, expr, params_loc.end_pos, CHECK_OK_VOID); |
| 4203 | 4178 |
| 4204 scope_snapshot.Reparent(parameters->scope); | 4179 scope_snapshot.Reparent(parameters->scope); |
| 4205 | 4180 |
| 4206 if (parameters->Arity() > Code::kMaxArguments) { | 4181 if (parameters->Arity() > Code::kMaxArguments) { |
| 4207 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); | 4182 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
| 4208 *ok = false; | 4183 *ok = false; |
| 4209 return; | 4184 return; |
| 4210 } | 4185 } |
| 4211 | 4186 |
| 4212 Type::ExpressionClassifier classifier(parser_); | 4187 Type::ExpressionClassifier classifier(parser_); |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4566 if (bookmark && bookmark->HasBeenReset()) { | 4541 if (bookmark && bookmark->HasBeenReset()) { |
| 4567 return; // Return immediately if pre-parser devided to abort parsing. | 4542 return; // Return immediately if pre-parser devided to abort parsing. |
| 4568 } | 4543 } |
| 4569 if (result == PreParser::kPreParseStackOverflow) { | 4544 if (result == PreParser::kPreParseStackOverflow) { |
| 4570 // Propagate stack overflow. | 4545 // Propagate stack overflow. |
| 4571 set_stack_overflow(); | 4546 set_stack_overflow(); |
| 4572 *ok = false; | 4547 *ok = false; |
| 4573 return; | 4548 return; |
| 4574 } | 4549 } |
| 4575 if (logger.has_error()) { | 4550 if (logger.has_error()) { |
| 4576 ParserTraits::ReportMessageAt( | 4551 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), |
| 4577 Scanner::Location(logger.start(), logger.end()), logger.message(), | 4552 logger.message(), logger.argument_opt(), |
| 4578 logger.argument_opt(), logger.error_type()); | 4553 logger.error_type()); |
| 4579 *ok = false; | 4554 *ok = false; |
| 4580 return; | 4555 return; |
| 4581 } | 4556 } |
| 4582 scope()->set_end_position(logger.end()); | 4557 scope()->set_end_position(logger.end()); |
| 4583 Expect(Token::RBRACE, CHECK_OK_VOID); | 4558 Expect(Token::RBRACE, CHECK_OK_VOID); |
| 4584 total_preparse_skipped_ += scope()->end_position() - function_block_pos; | 4559 total_preparse_skipped_ += scope()->end_position() - function_block_pos; |
| 4585 *materialized_literal_count = logger.literals(); | 4560 *materialized_literal_count = logger.literals(); |
| 4586 *expected_property_count = logger.properties(); | 4561 *expected_property_count = logger.properties(); |
| 4587 SetLanguageMode(scope(), logger.language_mode()); | 4562 SetLanguageMode(scope(), logger.language_mode()); |
| 4588 if (logger.uses_super_property()) { | 4563 if (logger.uses_super_property()) { |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5162 return NULL; | 5137 return NULL; |
| 5163 } | 5138 } |
| 5164 | 5139 |
| 5165 return factory()->NewCallRuntime(function, args, pos); | 5140 return factory()->NewCallRuntime(function, args, pos); |
| 5166 } | 5141 } |
| 5167 | 5142 |
| 5168 int context_index = Context::IntrinsicIndexForName(name->string()); | 5143 int context_index = Context::IntrinsicIndexForName(name->string()); |
| 5169 | 5144 |
| 5170 // Check that the function is defined. | 5145 // Check that the function is defined. |
| 5171 if (context_index == Context::kNotFound) { | 5146 if (context_index == Context::kNotFound) { |
| 5172 ParserTraits::ReportMessage(MessageTemplate::kNotDefined, name); | 5147 ReportMessage(MessageTemplate::kNotDefined, name); |
| 5173 *ok = false; | 5148 *ok = false; |
| 5174 return NULL; | 5149 return NULL; |
| 5175 } | 5150 } |
| 5176 | 5151 |
| 5177 return factory()->NewCallRuntime(context_index, args, pos); | 5152 return factory()->NewCallRuntime(context_index, args, pos); |
| 5178 } | 5153 } |
| 5179 | 5154 |
| 5180 | 5155 |
| 5181 Literal* Parser::GetLiteralUndefined(int position) { | 5156 Literal* Parser::GetLiteralUndefined(int position) { |
| 5182 return factory()->NewUndefinedLiteral(position); | 5157 return factory()->NewUndefinedLiteral(position); |
| 5183 } | 5158 } |
| 5184 | 5159 |
| 5185 | 5160 |
| 5186 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { | 5161 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { |
| 5187 Declaration* decl = scope->CheckConflictingVarDeclarations(); | 5162 Declaration* decl = scope->CheckConflictingVarDeclarations(); |
| 5188 if (decl != NULL) { | 5163 if (decl != NULL) { |
| 5189 // In ES6, conflicting variable bindings are early errors. | 5164 // In ES6, conflicting variable bindings are early errors. |
| 5190 const AstRawString* name = decl->proxy()->raw_name(); | 5165 const AstRawString* name = decl->proxy()->raw_name(); |
| 5191 int position = decl->proxy()->position(); | 5166 int position = decl->proxy()->position(); |
| 5192 Scanner::Location location = | 5167 Scanner::Location location = |
| 5193 position == kNoSourcePosition | 5168 position == kNoSourcePosition |
| 5194 ? Scanner::Location::invalid() | 5169 ? Scanner::Location::invalid() |
| 5195 : Scanner::Location(position, position + 1); | 5170 : Scanner::Location(position, position + 1); |
| 5196 ParserTraits::ReportMessageAt(location, MessageTemplate::kVarRedeclaration, | 5171 ReportMessageAt(location, MessageTemplate::kVarRedeclaration, name); |
| 5197 name); | |
| 5198 *ok = false; | 5172 *ok = false; |
| 5199 } | 5173 } |
| 5200 } | 5174 } |
| 5201 | 5175 |
| 5202 | 5176 |
| 5203 void Parser::InsertShadowingVarBindingInitializers(Block* inner_block) { | 5177 void Parser::InsertShadowingVarBindingInitializers(Block* inner_block) { |
| 5204 // For each var-binding that shadows a parameter, insert an assignment | 5178 // For each var-binding that shadows a parameter, insert an assignment |
| 5205 // initializing the variable with the parameter. | 5179 // initializing the variable with the parameter. |
| 5206 Scope* inner_scope = inner_block->scope(); | 5180 Scope* inner_scope = inner_block->scope(); |
| 5207 DCHECK(inner_scope->is_declaration_scope()); | 5181 DCHECK(inner_scope->is_declaration_scope()); |
| (...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6086 return; | 6060 return; |
| 6087 } | 6061 } |
| 6088 } | 6062 } |
| 6089 | 6063 |
| 6090 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] | 6064 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] |
| 6091 // of an object literal. | 6065 // of an object literal. |
| 6092 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; | 6066 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; |
| 6093 | 6067 |
| 6094 DCHECK(!value->IsAnonymousFunctionDefinition() || | 6068 DCHECK(!value->IsAnonymousFunctionDefinition() || |
| 6095 property->kind() == ObjectLiteralProperty::COMPUTED); | 6069 property->kind() == ObjectLiteralProperty::COMPUTED); |
| 6096 SetFunctionName(value, name); | 6070 parser_->SetFunctionName(value, name); |
| 6097 } | 6071 } |
| 6098 | 6072 |
| 6099 | 6073 |
| 6100 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, | 6074 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, |
| 6101 Expression* identifier) { | 6075 Expression* identifier) { |
| 6102 if (!identifier->IsVariableProxy()) return; | 6076 if (!identifier->IsVariableProxy()) return; |
| 6103 SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); | 6077 parser_->SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); |
| 6104 } | 6078 } |
| 6105 | 6079 |
| 6106 | 6080 void Parser::SetFunctionName(Expression* value, const AstRawString* name) { |
| 6107 void ParserTraits::SetFunctionName(Expression* value, | |
| 6108 const AstRawString* name) { | |
| 6109 DCHECK_NOT_NULL(name); | 6081 DCHECK_NOT_NULL(name); |
| 6110 if (!value->IsAnonymousFunctionDefinition()) return; | 6082 if (!value->IsAnonymousFunctionDefinition()) return; |
| 6111 auto function = value->AsFunctionLiteral(); | 6083 auto function = value->AsFunctionLiteral(); |
| 6112 if (function != nullptr) { | 6084 if (function != nullptr) { |
| 6113 function->set_raw_name(name); | 6085 function->set_raw_name(name); |
| 6114 } else { | 6086 } else { |
| 6115 DCHECK(value->IsDoExpression()); | 6087 DCHECK(value->IsDoExpression()); |
| 6116 value->AsDoExpression()->represented_function()->set_raw_name(name); | 6088 value->AsDoExpression()->represented_function()->set_raw_name(name); |
| 6117 } | 6089 } |
| 6118 } | 6090 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6191 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); | 6163 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); |
| 6192 // } | 6164 // } |
| 6193 // | 6165 // |
| 6194 // IteratorClose(iterator, input, output) expands to the following: | 6166 // IteratorClose(iterator, input, output) expands to the following: |
| 6195 // | 6167 // |
| 6196 // let iteratorReturn = iterator.return; | 6168 // let iteratorReturn = iterator.return; |
| 6197 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input; | 6169 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input; |
| 6198 // output = %_Call(iteratorReturn, iterator, input); | 6170 // output = %_Call(iteratorReturn, iterator, input); |
| 6199 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); | 6171 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); |
| 6200 | 6172 |
| 6201 Expression* ParserTraits::RewriteYieldStar( | 6173 Expression* Parser::RewriteYieldStar(Expression* generator, |
| 6202 Expression* generator, Expression* iterable, int pos) { | 6174 Expression* iterable, int pos) { |
| 6203 const int nopos = kNoSourcePosition; | 6175 const int nopos = kNoSourcePosition; |
| 6204 | 6176 |
| 6205 auto factory = parser_->factory(); | |
| 6206 auto avfactory = parser_->ast_value_factory(); | |
| 6207 auto zone = parser_->zone(); | |
| 6208 | |
| 6209 | |
| 6210 // Forward definition for break/continue statements. | 6177 // Forward definition for break/continue statements. |
| 6211 WhileStatement* loop = factory->NewWhileStatement(nullptr, nopos); | 6178 WhileStatement* loop = factory()->NewWhileStatement(nullptr, nopos); |
| 6212 | |
| 6213 | 6179 |
| 6214 // let input = undefined; | 6180 // let input = undefined; |
| 6215 Variable* var_input = parser_->NewTemporary(avfactory->empty_string()); | 6181 Variable* var_input = NewTemporary(ast_value_factory()->empty_string()); |
| 6216 Statement* initialize_input; | 6182 Statement* initialize_input; |
| 6217 { | 6183 { |
| 6218 Expression* input_proxy = factory->NewVariableProxy(var_input); | 6184 Expression* input_proxy = factory()->NewVariableProxy(var_input); |
| 6219 Expression* assignment = factory->NewAssignment( | 6185 Expression* assignment = |
| 6220 Token::ASSIGN, input_proxy, factory->NewUndefinedLiteral(nopos), nopos); | 6186 factory()->NewAssignment(Token::ASSIGN, input_proxy, |
| 6221 initialize_input = factory->NewExpressionStatement(assignment, nopos); | 6187 factory()->NewUndefinedLiteral(nopos), nopos); |
| 6222 } | 6188 initialize_input = factory()->NewExpressionStatement(assignment, nopos); |
| 6223 | 6189 } |
| 6224 | 6190 |
| 6225 // let mode = kNext; | 6191 // let mode = kNext; |
| 6226 Variable* var_mode = parser_->NewTemporary(avfactory->empty_string()); | 6192 Variable* var_mode = NewTemporary(ast_value_factory()->empty_string()); |
| 6227 Statement* initialize_mode; | 6193 Statement* initialize_mode; |
| 6228 { | 6194 { |
| 6229 Expression* mode_proxy = factory->NewVariableProxy(var_mode); | 6195 Expression* mode_proxy = factory()->NewVariableProxy(var_mode); |
| 6230 Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos); | 6196 Expression* knext = |
| 6231 Expression* assignment = | 6197 factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos); |
| 6232 factory->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos); | 6198 Expression* assignment = |
| 6233 initialize_mode = factory->NewExpressionStatement(assignment, nopos); | 6199 factory()->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos); |
| 6234 } | 6200 initialize_mode = factory()->NewExpressionStatement(assignment, nopos); |
| 6235 | 6201 } |
| 6236 | 6202 |
| 6237 // let output = undefined; | 6203 // let output = undefined; |
| 6238 Variable* var_output = parser_->NewTemporary(avfactory->empty_string()); | 6204 Variable* var_output = NewTemporary(ast_value_factory()->empty_string()); |
| 6239 Statement* initialize_output; | 6205 Statement* initialize_output; |
| 6240 { | 6206 { |
| 6241 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6207 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6242 Expression* assignment = factory->NewAssignment( | 6208 Expression* assignment = |
| 6243 Token::ASSIGN, output_proxy, factory->NewUndefinedLiteral(nopos), | 6209 factory()->NewAssignment(Token::ASSIGN, output_proxy, |
| 6244 nopos); | 6210 factory()->NewUndefinedLiteral(nopos), nopos); |
| 6245 initialize_output = factory->NewExpressionStatement(assignment, nopos); | 6211 initialize_output = factory()->NewExpressionStatement(assignment, nopos); |
| 6246 } | 6212 } |
| 6247 | |
| 6248 | 6213 |
| 6249 // let iterator = iterable[Symbol.iterator]; | 6214 // let iterator = iterable[Symbol.iterator]; |
| 6250 Variable* var_iterator = parser_->NewTemporary(avfactory->empty_string()); | 6215 Variable* var_iterator = NewTemporary(ast_value_factory()->empty_string()); |
| 6251 Statement* get_iterator; | 6216 Statement* get_iterator; |
| 6252 { | 6217 { |
| 6253 Expression* iterator = GetIterator(iterable, factory, nopos); | 6218 Expression* iterator = GetIterator(iterable, factory(), nopos); |
| 6254 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); | 6219 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator); |
| 6255 Expression* assignment = factory->NewAssignment( | 6220 Expression* assignment = factory()->NewAssignment( |
| 6256 Token::ASSIGN, iterator_proxy, iterator, nopos); | 6221 Token::ASSIGN, iterator_proxy, iterator, nopos); |
| 6257 get_iterator = factory->NewExpressionStatement(assignment, nopos); | 6222 get_iterator = factory()->NewExpressionStatement(assignment, nopos); |
| 6258 } | 6223 } |
| 6259 | |
| 6260 | 6224 |
| 6261 // if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid); | 6225 // if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid); |
| 6262 Statement* validate_iterator; | 6226 Statement* validate_iterator; |
| 6263 { | 6227 { |
| 6264 Expression* is_receiver_call; | 6228 Expression* is_receiver_call; |
| 6265 { | 6229 { |
| 6266 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6230 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6267 args->Add(factory->NewVariableProxy(var_iterator), zone); | 6231 args->Add(factory()->NewVariableProxy(var_iterator), zone()); |
| 6268 is_receiver_call = | 6232 is_receiver_call = |
| 6269 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 6233 factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |
| 6270 } | 6234 } |
| 6271 | 6235 |
| 6272 Statement* throw_call; | 6236 Statement* throw_call; |
| 6273 { | 6237 { |
| 6274 Expression* call = NewThrowTypeError( | 6238 Expression* call = |
| 6275 MessageTemplate::kSymbolIteratorInvalid, avfactory->empty_string(), | 6239 NewThrowTypeError(MessageTemplate::kSymbolIteratorInvalid, |
| 6276 nopos); | 6240 ast_value_factory()->empty_string(), nopos); |
| 6277 throw_call = factory->NewExpressionStatement(call, nopos); | 6241 throw_call = factory()->NewExpressionStatement(call, nopos); |
| 6278 } | 6242 } |
| 6279 | 6243 |
| 6280 validate_iterator = factory->NewIfStatement( | 6244 validate_iterator = factory()->NewIfStatement( |
| 6281 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6245 is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call, |
| 6282 } | 6246 nopos); |
| 6283 | 6247 } |
| 6284 | 6248 |
| 6285 // output = iterator.next(input); | 6249 // output = iterator.next(input); |
| 6286 Statement* call_next; | 6250 Statement* call_next; |
| 6287 { | 6251 { |
| 6288 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); | 6252 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator); |
| 6289 Expression* literal = | 6253 Expression* literal = |
| 6290 factory->NewStringLiteral(avfactory->next_string(), nopos); | 6254 factory()->NewStringLiteral(ast_value_factory()->next_string(), nopos); |
| 6291 Expression* next_property = | 6255 Expression* next_property = |
| 6292 factory->NewProperty(iterator_proxy, literal, nopos); | 6256 factory()->NewProperty(iterator_proxy, literal, nopos); |
| 6293 Expression* input_proxy = factory->NewVariableProxy(var_input); | 6257 Expression* input_proxy = factory()->NewVariableProxy(var_input); |
| 6294 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6258 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6295 args->Add(input_proxy, zone); | 6259 args->Add(input_proxy, zone()); |
| 6296 Expression* call = factory->NewCall(next_property, args, nopos); | 6260 Expression* call = factory()->NewCall(next_property, args, nopos); |
| 6297 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6261 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6298 Expression* assignment = | 6262 Expression* assignment = |
| 6299 factory->NewAssignment(Token::ASSIGN, output_proxy, call, nopos); | 6263 factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos); |
| 6300 call_next = factory->NewExpressionStatement(assignment, nopos); | 6264 call_next = factory()->NewExpressionStatement(assignment, nopos); |
| 6301 } | 6265 } |
| 6302 | |
| 6303 | 6266 |
| 6304 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); | 6267 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); |
| 6305 Statement* validate_next_output; | 6268 Statement* validate_next_output; |
| 6306 { | 6269 { |
| 6307 Expression* is_receiver_call; | 6270 Expression* is_receiver_call; |
| 6308 { | 6271 { |
| 6309 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6272 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6310 args->Add(factory->NewVariableProxy(var_output), zone); | 6273 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6311 is_receiver_call = | 6274 is_receiver_call = |
| 6312 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 6275 factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |
| 6313 } | 6276 } |
| 6314 | 6277 |
| 6315 Statement* throw_call; | 6278 Statement* throw_call; |
| 6316 { | 6279 { |
| 6317 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6280 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6318 args->Add(factory->NewVariableProxy(var_output), zone); | 6281 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6319 Expression* call = factory->NewCallRuntime( | 6282 Expression* call = factory()->NewCallRuntime( |
| 6320 Runtime::kThrowIteratorResultNotAnObject, args, nopos); | 6283 Runtime::kThrowIteratorResultNotAnObject, args, nopos); |
| 6321 throw_call = factory->NewExpressionStatement(call, nopos); | 6284 throw_call = factory()->NewExpressionStatement(call, nopos); |
| 6322 } | 6285 } |
| 6323 | 6286 |
| 6324 validate_next_output = factory->NewIfStatement( | 6287 validate_next_output = factory()->NewIfStatement( |
| 6325 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6288 is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call, |
| 6326 } | 6289 nopos); |
| 6327 | 6290 } |
| 6328 | 6291 |
| 6329 // let iteratorThrow = iterator.throw; | 6292 // let iteratorThrow = iterator.throw; |
| 6330 Variable* var_throw = parser_->NewTemporary(avfactory->empty_string()); | 6293 Variable* var_throw = NewTemporary(ast_value_factory()->empty_string()); |
| 6331 Statement* get_throw; | 6294 Statement* get_throw; |
| 6332 { | 6295 { |
| 6333 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); | 6296 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator); |
| 6334 Expression* literal = | 6297 Expression* literal = |
| 6335 factory->NewStringLiteral(avfactory->throw_string(), nopos); | 6298 factory()->NewStringLiteral(ast_value_factory()->throw_string(), nopos); |
| 6336 Expression* property = | 6299 Expression* property = |
| 6337 factory->NewProperty(iterator_proxy, literal, nopos); | 6300 factory()->NewProperty(iterator_proxy, literal, nopos); |
| 6338 Expression* throw_proxy = factory->NewVariableProxy(var_throw); | 6301 Expression* throw_proxy = factory()->NewVariableProxy(var_throw); |
| 6339 Expression* assignment = factory->NewAssignment( | 6302 Expression* assignment = |
| 6340 Token::ASSIGN, throw_proxy, property, nopos); | 6303 factory()->NewAssignment(Token::ASSIGN, throw_proxy, property, nopos); |
| 6341 get_throw = factory->NewExpressionStatement(assignment, nopos); | 6304 get_throw = factory()->NewExpressionStatement(assignment, nopos); |
| 6342 } | 6305 } |
| 6343 | |
| 6344 | 6306 |
| 6345 // if (IS_NULL_OR_UNDEFINED(iteratorThrow) { | 6307 // if (IS_NULL_OR_UNDEFINED(iteratorThrow) { |
| 6346 // IteratorClose(iterator); | 6308 // IteratorClose(iterator); |
| 6347 // throw MakeTypeError(kThrowMethodMissing); | 6309 // throw MakeTypeError(kThrowMethodMissing); |
| 6348 // } | 6310 // } |
| 6349 Statement* check_throw; | 6311 Statement* check_throw; |
| 6350 { | 6312 { |
| 6351 Expression* condition = factory->NewCompareOperation( | 6313 Expression* condition = factory()->NewCompareOperation( |
| 6352 Token::EQ, factory->NewVariableProxy(var_throw), | 6314 Token::EQ, factory()->NewVariableProxy(var_throw), |
| 6353 factory->NewNullLiteral(nopos), nopos); | 6315 factory()->NewNullLiteral(nopos), nopos); |
| 6354 | 6316 Expression* call = |
| 6355 Expression* call = NewThrowTypeError( | 6317 NewThrowTypeError(MessageTemplate::kThrowMethodMissing, |
| 6356 MessageTemplate::kThrowMethodMissing, | 6318 ast_value_factory()->empty_string(), nopos); |
| 6357 avfactory->empty_string(), nopos); | 6319 Statement* throw_call = factory()->NewExpressionStatement(call, nopos); |
| 6358 Statement* throw_call = factory->NewExpressionStatement(call, nopos); | 6320 |
| 6359 | 6321 Block* then = factory()->NewBlock(nullptr, 4 + 1, false, nopos); |
| 6360 Block* then = factory->NewBlock(nullptr, 4+1, false, nopos); | 6322 BuildIteratorCloseForCompletion( |
| 6361 parser_->BuildIteratorCloseForCompletion( | |
| 6362 then->statements(), var_iterator, | 6323 then->statements(), var_iterator, |
| 6363 factory->NewSmiLiteral(Parser::kNormalCompletion, nopos)); | 6324 factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos)); |
| 6364 then->statements()->Add(throw_call, zone); | 6325 then->statements()->Add(throw_call, zone()); |
| 6365 check_throw = factory->NewIfStatement( | 6326 check_throw = factory()->NewIfStatement( |
| 6366 condition, then, factory->NewEmptyStatement(nopos), nopos); | 6327 condition, then, factory()->NewEmptyStatement(nopos), nopos); |
| 6367 } | 6328 } |
| 6368 | |
| 6369 | 6329 |
| 6370 // output = %_Call(iteratorThrow, iterator, input); | 6330 // output = %_Call(iteratorThrow, iterator, input); |
| 6371 Statement* call_throw; | 6331 Statement* call_throw; |
| 6372 { | 6332 { |
| 6373 auto args = new (zone) ZoneList<Expression*>(3, zone); | 6333 auto args = new (zone()) ZoneList<Expression*>(3, zone()); |
| 6374 args->Add(factory->NewVariableProxy(var_throw), zone); | 6334 args->Add(factory()->NewVariableProxy(var_throw), zone()); |
| 6375 args->Add(factory->NewVariableProxy(var_iterator), zone); | 6335 args->Add(factory()->NewVariableProxy(var_iterator), zone()); |
| 6376 args->Add(factory->NewVariableProxy(var_input), zone); | 6336 args->Add(factory()->NewVariableProxy(var_input), zone()); |
| 6377 Expression* call = | 6337 Expression* call = |
| 6378 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); | 6338 factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos); |
| 6379 Expression* assignment = factory->NewAssignment( | 6339 Expression* assignment = factory()->NewAssignment( |
| 6380 Token::ASSIGN, factory->NewVariableProxy(var_output), call, nopos); | 6340 Token::ASSIGN, factory()->NewVariableProxy(var_output), call, nopos); |
| 6381 call_throw = factory->NewExpressionStatement(assignment, nopos); | 6341 call_throw = factory()->NewExpressionStatement(assignment, nopos); |
| 6382 } | 6342 } |
| 6383 | |
| 6384 | 6343 |
| 6385 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); | 6344 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); |
| 6386 Statement* validate_throw_output; | 6345 Statement* validate_throw_output; |
| 6387 { | 6346 { |
| 6388 Expression* is_receiver_call; | 6347 Expression* is_receiver_call; |
| 6389 { | 6348 { |
| 6390 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6349 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6391 args->Add(factory->NewVariableProxy(var_output), zone); | 6350 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6392 is_receiver_call = | 6351 is_receiver_call = |
| 6393 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 6352 factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |
| 6394 } | 6353 } |
| 6395 | 6354 |
| 6396 Statement* throw_call; | 6355 Statement* throw_call; |
| 6397 { | 6356 { |
| 6398 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6357 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6399 args->Add(factory->NewVariableProxy(var_output), zone); | 6358 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6400 Expression* call = factory->NewCallRuntime( | 6359 Expression* call = factory()->NewCallRuntime( |
| 6401 Runtime::kThrowIteratorResultNotAnObject, args, nopos); | 6360 Runtime::kThrowIteratorResultNotAnObject, args, nopos); |
| 6402 throw_call = factory->NewExpressionStatement(call, nopos); | 6361 throw_call = factory()->NewExpressionStatement(call, nopos); |
| 6403 } | 6362 } |
| 6404 | 6363 |
| 6405 validate_throw_output = factory->NewIfStatement( | 6364 validate_throw_output = factory()->NewIfStatement( |
| 6406 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6365 is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call, |
| 6407 } | 6366 nopos); |
| 6408 | 6367 } |
| 6409 | 6368 |
| 6410 // if (output.done) break; | 6369 // if (output.done) break; |
| 6411 Statement* if_done; | 6370 Statement* if_done; |
| 6412 { | 6371 { |
| 6413 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6372 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6414 Expression* literal = | 6373 Expression* literal = |
| 6415 factory->NewStringLiteral(avfactory->done_string(), nopos); | 6374 factory()->NewStringLiteral(ast_value_factory()->done_string(), nopos); |
| 6416 Expression* property = factory->NewProperty(output_proxy, literal, nopos); | 6375 Expression* property = factory()->NewProperty(output_proxy, literal, nopos); |
| 6417 BreakStatement* break_loop = factory->NewBreakStatement(loop, nopos); | 6376 BreakStatement* break_loop = factory()->NewBreakStatement(loop, nopos); |
| 6418 if_done = factory->NewIfStatement( | 6377 if_done = factory()->NewIfStatement( |
| 6419 property, break_loop, factory->NewEmptyStatement(nopos), nopos); | 6378 property, break_loop, factory()->NewEmptyStatement(nopos), nopos); |
| 6420 } | 6379 } |
| 6421 | 6380 |
| 6422 | 6381 |
| 6423 // mode = kReturn; | 6382 // mode = kReturn; |
| 6424 Statement* set_mode_return; | 6383 Statement* set_mode_return; |
| 6425 { | 6384 { |
| 6426 Expression* mode_proxy = factory->NewVariableProxy(var_mode); | 6385 Expression* mode_proxy = factory()->NewVariableProxy(var_mode); |
| 6427 Expression* kreturn = | 6386 Expression* kreturn = |
| 6428 factory->NewSmiLiteral(JSGeneratorObject::kReturn, nopos); | 6387 factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos); |
| 6429 Expression* assignment = | 6388 Expression* assignment = |
| 6430 factory->NewAssignment(Token::ASSIGN, mode_proxy, kreturn, nopos); | 6389 factory()->NewAssignment(Token::ASSIGN, mode_proxy, kreturn, nopos); |
| 6431 set_mode_return = factory->NewExpressionStatement(assignment, nopos); | 6390 set_mode_return = factory()->NewExpressionStatement(assignment, nopos); |
| 6432 } | 6391 } |
| 6433 | 6392 |
| 6434 // Yield(output); | 6393 // Yield(output); |
| 6435 Statement* yield_output; | 6394 Statement* yield_output; |
| 6436 { | 6395 { |
| 6437 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6396 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6438 Yield* yield = factory->NewYield(generator, output_proxy, nopos, | 6397 Yield* yield = factory()->NewYield(generator, output_proxy, nopos, |
| 6439 Yield::kOnExceptionThrow); | 6398 Yield::kOnExceptionThrow); |
| 6440 yield_output = factory->NewExpressionStatement(yield, nopos); | 6399 yield_output = factory()->NewExpressionStatement(yield, nopos); |
| 6441 } | 6400 } |
| 6442 | |
| 6443 | 6401 |
| 6444 // mode = kNext; | 6402 // mode = kNext; |
| 6445 Statement* set_mode_next; | 6403 Statement* set_mode_next; |
| 6446 { | 6404 { |
| 6447 Expression* mode_proxy = factory->NewVariableProxy(var_mode); | 6405 Expression* mode_proxy = factory()->NewVariableProxy(var_mode); |
| 6448 Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos); | 6406 Expression* knext = |
| 6449 Expression* assignment = | 6407 factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos); |
| 6450 factory->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos); | 6408 Expression* assignment = |
| 6451 set_mode_next = factory->NewExpressionStatement(assignment, nopos); | 6409 factory()->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos); |
| 6452 } | 6410 set_mode_next = factory()->NewExpressionStatement(assignment, nopos); |
| 6453 | 6411 } |
| 6454 | 6412 |
| 6455 // mode = kThrow; | 6413 // mode = kThrow; |
| 6456 Statement* set_mode_throw; | 6414 Statement* set_mode_throw; |
| 6457 { | 6415 { |
| 6458 Expression* mode_proxy = factory->NewVariableProxy(var_mode); | 6416 Expression* mode_proxy = factory()->NewVariableProxy(var_mode); |
| 6459 Expression* kthrow = | 6417 Expression* kthrow = |
| 6460 factory->NewSmiLiteral(JSGeneratorObject::kThrow, nopos); | 6418 factory()->NewSmiLiteral(JSGeneratorObject::kThrow, nopos); |
| 6461 Expression* assignment = | 6419 Expression* assignment = |
| 6462 factory->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos); | 6420 factory()->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos); |
| 6463 set_mode_throw = factory->NewExpressionStatement(assignment, nopos); | 6421 set_mode_throw = factory()->NewExpressionStatement(assignment, nopos); |
| 6464 } | 6422 } |
| 6465 | |
| 6466 | 6423 |
| 6467 // input = function.sent; | 6424 // input = function.sent; |
| 6468 Statement* get_input; | 6425 Statement* get_input; |
| 6469 { | 6426 { |
| 6470 Expression* function_sent = FunctionSentExpression(factory, nopos); | 6427 Expression* function_sent = FunctionSentExpression(factory(), nopos); |
| 6471 Expression* input_proxy = factory->NewVariableProxy(var_input); | 6428 Expression* input_proxy = factory()->NewVariableProxy(var_input); |
| 6472 Expression* assignment = factory->NewAssignment( | 6429 Expression* assignment = factory()->NewAssignment( |
| 6473 Token::ASSIGN, input_proxy, function_sent, nopos); | 6430 Token::ASSIGN, input_proxy, function_sent, nopos); |
| 6474 get_input = factory->NewExpressionStatement(assignment, nopos); | 6431 get_input = factory()->NewExpressionStatement(assignment, nopos); |
| 6475 } | 6432 } |
| 6476 | |
| 6477 | 6433 |
| 6478 // if (mode === kReturn) { | 6434 // if (mode === kReturn) { |
| 6479 // return {value: output.value, done: true}; | 6435 // return {value: output.value, done: true}; |
| 6480 // } | 6436 // } |
| 6481 Statement* maybe_return_value; | 6437 Statement* maybe_return_value; |
| 6482 { | 6438 { |
| 6483 Expression* mode_proxy = factory->NewVariableProxy(var_mode); | 6439 Expression* mode_proxy = factory()->NewVariableProxy(var_mode); |
| 6484 Expression* kreturn = | 6440 Expression* kreturn = |
| 6485 factory->NewSmiLiteral(JSGeneratorObject::kReturn, nopos); | 6441 factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos); |
| 6486 Expression* condition = factory->NewCompareOperation( | 6442 Expression* condition = factory()->NewCompareOperation( |
| 6487 Token::EQ_STRICT, mode_proxy, kreturn, nopos); | 6443 Token::EQ_STRICT, mode_proxy, kreturn, nopos); |
| 6488 | 6444 |
| 6489 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6445 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6490 Expression* literal = | 6446 Expression* literal = |
| 6491 factory->NewStringLiteral(avfactory->value_string(), nopos); | 6447 factory()->NewStringLiteral(ast_value_factory()->value_string(), nopos); |
| 6492 Expression* property = factory->NewProperty(output_proxy, literal, nopos); | 6448 Expression* property = factory()->NewProperty(output_proxy, literal, nopos); |
| 6493 Statement* return_value = | 6449 Statement* return_value = factory()->NewReturnStatement( |
| 6494 factory->NewReturnStatement(BuildIteratorResult(property, true), nopos); | 6450 BuildIteratorResult(property, true), nopos); |
| 6495 | 6451 |
| 6496 maybe_return_value = factory->NewIfStatement( | 6452 maybe_return_value = factory()->NewIfStatement( |
| 6497 condition, return_value, factory->NewEmptyStatement(nopos), nopos); | 6453 condition, return_value, factory()->NewEmptyStatement(nopos), nopos); |
| 6498 } | 6454 } |
| 6499 | |
| 6500 | 6455 |
| 6501 // output.value | 6456 // output.value |
| 6502 Statement* get_value; | 6457 Statement* get_value; |
| 6503 { | 6458 { |
| 6504 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6459 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6505 Expression* literal = | 6460 Expression* literal = |
| 6506 factory->NewStringLiteral(avfactory->value_string(), nopos); | 6461 factory()->NewStringLiteral(ast_value_factory()->value_string(), nopos); |
| 6507 Expression* property = factory->NewProperty(output_proxy, literal, nopos); | 6462 Expression* property = factory()->NewProperty(output_proxy, literal, nopos); |
| 6508 get_value = factory->NewExpressionStatement(property, nopos); | 6463 get_value = factory()->NewExpressionStatement(property, nopos); |
| 6509 } | 6464 } |
| 6510 | |
| 6511 | 6465 |
| 6512 // Now put things together. | 6466 // Now put things together. |
| 6513 | 6467 |
| 6514 | |
| 6515 // try { ... } catch(e) { ... } | 6468 // try { ... } catch(e) { ... } |
| 6516 Statement* try_catch; | 6469 Statement* try_catch; |
| 6517 { | 6470 { |
| 6518 Block* try_block = factory->NewBlock(nullptr, 2, false, nopos); | 6471 Block* try_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 6519 try_block->statements()->Add(yield_output, zone); | 6472 try_block->statements()->Add(yield_output, zone()); |
| 6520 try_block->statements()->Add(set_mode_next, zone); | 6473 try_block->statements()->Add(set_mode_next, zone()); |
| 6521 | 6474 |
| 6522 Block* catch_block = factory->NewBlock(nullptr, 1, false, nopos); | 6475 Block* catch_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 6523 catch_block->statements()->Add(set_mode_throw, zone); | 6476 catch_block->statements()->Add(set_mode_throw, zone()); |
| 6524 | 6477 |
| 6525 Scope* catch_scope = NewScope(CATCH_SCOPE); | 6478 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 6526 catch_scope->set_is_hidden(); | 6479 catch_scope->set_is_hidden(); |
| 6527 const AstRawString* name = avfactory->dot_catch_string(); | 6480 const AstRawString* name = ast_value_factory()->dot_catch_string(); |
| 6528 Variable* catch_variable = | 6481 Variable* catch_variable = |
| 6529 catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, | 6482 catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, |
| 6530 Variable::NORMAL); | 6483 Variable::NORMAL); |
| 6531 | 6484 |
| 6532 try_catch = factory->NewTryCatchStatementForDesugaring( | 6485 try_catch = factory()->NewTryCatchStatementForDesugaring( |
| 6533 try_block, catch_scope, catch_variable, catch_block, nopos); | 6486 try_block, catch_scope, catch_variable, catch_block, nopos); |
| 6534 } | 6487 } |
| 6535 | 6488 |
| 6536 | |
| 6537 // try { ... } finally { ... } | 6489 // try { ... } finally { ... } |
| 6538 Statement* try_finally; | 6490 Statement* try_finally; |
| 6539 { | 6491 { |
| 6540 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); | 6492 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 6541 try_block->statements()->Add(try_catch, zone); | 6493 try_block->statements()->Add(try_catch, zone()); |
| 6542 | 6494 |
| 6543 Block* finally = factory->NewBlock(nullptr, 2, false, nopos); | 6495 Block* finally = factory()->NewBlock(nullptr, 2, false, nopos); |
| 6544 finally->statements()->Add(get_input, zone); | 6496 finally->statements()->Add(get_input, zone()); |
| 6545 finally->statements()->Add( | 6497 finally->statements()->Add(factory()->NewContinueStatement(loop, nopos), |
| 6546 factory->NewContinueStatement(loop, nopos), zone); | 6498 zone()); |
| 6547 | 6499 |
| 6548 try_finally = factory->NewTryFinallyStatement(try_block, finally, nopos); | 6500 try_finally = factory()->NewTryFinallyStatement(try_block, finally, nopos); |
| 6549 } | 6501 } |
| 6550 | |
| 6551 | 6502 |
| 6552 // switch (mode) { ... } | 6503 // switch (mode) { ... } |
| 6553 SwitchStatement* switch_mode = factory->NewSwitchStatement(nullptr, nopos); | 6504 SwitchStatement* switch_mode = factory()->NewSwitchStatement(nullptr, nopos); |
| 6554 { | 6505 { |
| 6555 auto case_next = new (zone) ZoneList<Statement*>(3, zone); | 6506 auto case_next = new (zone()) ZoneList<Statement*>(3, zone()); |
| 6556 case_next->Add(call_next, zone); | 6507 case_next->Add(call_next, zone()); |
| 6557 case_next->Add(validate_next_output, zone); | 6508 case_next->Add(validate_next_output, zone()); |
| 6558 case_next->Add(factory->NewBreakStatement(switch_mode, nopos), zone); | 6509 case_next->Add(factory()->NewBreakStatement(switch_mode, nopos), zone()); |
| 6559 | 6510 |
| 6560 auto case_return = new (zone) ZoneList<Statement*>(5, zone); | 6511 auto case_return = new (zone()) ZoneList<Statement*>(5, zone()); |
| 6561 BuildIteratorClose(case_return, var_iterator, var_input, var_output); | 6512 BuildIteratorClose(case_return, var_iterator, var_input, var_output); |
| 6562 case_return->Add(factory->NewBreakStatement(switch_mode, nopos), zone); | 6513 case_return->Add(factory()->NewBreakStatement(switch_mode, nopos), zone()); |
| 6563 | 6514 |
| 6564 auto case_throw = new (zone) ZoneList<Statement*>(5, zone); | 6515 auto case_throw = new (zone()) ZoneList<Statement*>(5, zone()); |
| 6565 case_throw->Add(get_throw, zone); | 6516 case_throw->Add(get_throw, zone()); |
| 6566 case_throw->Add(check_throw, zone); | 6517 case_throw->Add(check_throw, zone()); |
| 6567 case_throw->Add(call_throw, zone); | 6518 case_throw->Add(call_throw, zone()); |
| 6568 case_throw->Add(validate_throw_output, zone); | 6519 case_throw->Add(validate_throw_output, zone()); |
| 6569 case_throw->Add(factory->NewBreakStatement(switch_mode, nopos), zone); | 6520 case_throw->Add(factory()->NewBreakStatement(switch_mode, nopos), zone()); |
| 6570 | 6521 |
| 6571 auto cases = new (zone) ZoneList<CaseClause*>(3, zone); | 6522 auto cases = new (zone()) ZoneList<CaseClause*>(3, zone()); |
| 6572 Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos); | 6523 Expression* knext = |
| 6524 factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos); |
| 6573 Expression* kreturn = | 6525 Expression* kreturn = |
| 6574 factory->NewSmiLiteral(JSGeneratorObject::kReturn, nopos); | 6526 factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos); |
| 6575 Expression* kthrow = | 6527 Expression* kthrow = |
| 6576 factory->NewSmiLiteral(JSGeneratorObject::kThrow, nopos); | 6528 factory()->NewSmiLiteral(JSGeneratorObject::kThrow, nopos); |
| 6577 cases->Add(factory->NewCaseClause(knext, case_next, nopos), zone); | 6529 cases->Add(factory()->NewCaseClause(knext, case_next, nopos), zone()); |
| 6578 cases->Add(factory->NewCaseClause(kreturn, case_return, nopos), zone); | 6530 cases->Add(factory()->NewCaseClause(kreturn, case_return, nopos), zone()); |
| 6579 cases->Add(factory->NewCaseClause(kthrow, case_throw, nopos), zone); | 6531 cases->Add(factory()->NewCaseClause(kthrow, case_throw, nopos), zone()); |
| 6580 | 6532 |
| 6581 switch_mode->Initialize(factory->NewVariableProxy(var_mode), cases); | 6533 switch_mode->Initialize(factory()->NewVariableProxy(var_mode), cases); |
| 6582 } | 6534 } |
| 6583 | |
| 6584 | 6535 |
| 6585 // while (true) { ... } | 6536 // while (true) { ... } |
| 6586 // Already defined earlier: WhileStatement* loop = ... | 6537 // Already defined earlier: WhileStatement* loop = ... |
| 6587 { | 6538 { |
| 6588 Block* loop_body = factory->NewBlock(nullptr, 4, false, nopos); | 6539 Block* loop_body = factory()->NewBlock(nullptr, 4, false, nopos); |
| 6589 loop_body->statements()->Add(switch_mode, zone); | 6540 loop_body->statements()->Add(switch_mode, zone()); |
| 6590 loop_body->statements()->Add(if_done, zone); | 6541 loop_body->statements()->Add(if_done, zone()); |
| 6591 loop_body->statements()->Add(set_mode_return, zone); | 6542 loop_body->statements()->Add(set_mode_return, zone()); |
| 6592 loop_body->statements()->Add(try_finally, zone); | 6543 loop_body->statements()->Add(try_finally, zone()); |
| 6593 | 6544 |
| 6594 loop->Initialize(factory->NewBooleanLiteral(true, nopos), loop_body); | 6545 loop->Initialize(factory()->NewBooleanLiteral(true, nopos), loop_body); |
| 6595 } | 6546 } |
| 6596 | |
| 6597 | 6547 |
| 6598 // do { ... } | 6548 // do { ... } |
| 6599 DoExpression* yield_star; | 6549 DoExpression* yield_star; |
| 6600 { | 6550 { |
| 6601 // The rewriter needs to process the get_value statement only, hence we | 6551 // The rewriter needs to process the get_value statement only, hence we |
| 6602 // put the preceding statements into an init block. | 6552 // put the preceding statements into an init block. |
| 6603 | 6553 |
| 6604 Block* do_block_ = factory->NewBlock(nullptr, 7, true, nopos); | 6554 Block* do_block_ = factory()->NewBlock(nullptr, 7, true, nopos); |
| 6605 do_block_->statements()->Add(initialize_input, zone); | 6555 do_block_->statements()->Add(initialize_input, zone()); |
| 6606 do_block_->statements()->Add(initialize_mode, zone); | 6556 do_block_->statements()->Add(initialize_mode, zone()); |
| 6607 do_block_->statements()->Add(initialize_output, zone); | 6557 do_block_->statements()->Add(initialize_output, zone()); |
| 6608 do_block_->statements()->Add(get_iterator, zone); | 6558 do_block_->statements()->Add(get_iterator, zone()); |
| 6609 do_block_->statements()->Add(validate_iterator, zone); | 6559 do_block_->statements()->Add(validate_iterator, zone()); |
| 6610 do_block_->statements()->Add(loop, zone); | 6560 do_block_->statements()->Add(loop, zone()); |
| 6611 do_block_->statements()->Add(maybe_return_value, zone); | 6561 do_block_->statements()->Add(maybe_return_value, zone()); |
| 6612 | 6562 |
| 6613 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); | 6563 Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 6614 do_block->statements()->Add(do_block_, zone); | 6564 do_block->statements()->Add(do_block_, zone()); |
| 6615 do_block->statements()->Add(get_value, zone); | 6565 do_block->statements()->Add(get_value, zone()); |
| 6616 | 6566 |
| 6617 Variable* dot_result = | 6567 Variable* dot_result = |
| 6618 parser_->NewTemporary(avfactory->dot_result_string()); | 6568 NewTemporary(ast_value_factory()->dot_result_string()); |
| 6619 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); | 6569 yield_star = factory()->NewDoExpression(do_block, dot_result, nopos); |
| 6620 Rewriter::Rewrite(parser_, parser_->GetClosureScope(), yield_star, | 6570 Rewriter::Rewrite(this, GetClosureScope(), yield_star, ast_value_factory()); |
| 6621 avfactory); | |
| 6622 } | 6571 } |
| 6623 | 6572 |
| 6624 return yield_star; | 6573 return yield_star; |
| 6625 } | 6574 } |
| 6626 | 6575 |
| 6627 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, | 6576 Statement* Parser::CheckCallable(Variable* var, Expression* error, int pos) { |
| 6628 int pos) { | |
| 6629 auto factory = parser_->factory(); | |
| 6630 auto avfactory = parser_->ast_value_factory(); | |
| 6631 const int nopos = kNoSourcePosition; | 6577 const int nopos = kNoSourcePosition; |
| 6632 Statement* validate_var; | 6578 Statement* validate_var; |
| 6633 { | 6579 { |
| 6634 Expression* type_of = factory->NewUnaryOperation( | 6580 Expression* type_of = factory()->NewUnaryOperation( |
| 6635 Token::TYPEOF, factory->NewVariableProxy(var), nopos); | 6581 Token::TYPEOF, factory()->NewVariableProxy(var), nopos); |
| 6636 Expression* function_literal = | 6582 Expression* function_literal = factory()->NewStringLiteral( |
| 6637 factory->NewStringLiteral(avfactory->function_string(), nopos); | 6583 ast_value_factory()->function_string(), nopos); |
| 6638 Expression* condition = factory->NewCompareOperation( | 6584 Expression* condition = factory()->NewCompareOperation( |
| 6639 Token::EQ_STRICT, type_of, function_literal, nopos); | 6585 Token::EQ_STRICT, type_of, function_literal, nopos); |
| 6640 | 6586 |
| 6641 Statement* throw_call = factory->NewExpressionStatement(error, pos); | 6587 Statement* throw_call = factory()->NewExpressionStatement(error, pos); |
| 6642 | 6588 |
| 6643 validate_var = factory->NewIfStatement( | 6589 validate_var = factory()->NewIfStatement( |
| 6644 condition, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6590 condition, factory()->NewEmptyStatement(nopos), throw_call, nopos); |
| 6645 } | 6591 } |
| 6646 return validate_var; | 6592 return validate_var; |
| 6647 } | 6593 } |
| 6648 | 6594 |
| 6649 void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements, | 6595 void Parser::BuildIteratorClose(ZoneList<Statement*>* statements, |
| 6650 Variable* iterator, Variable* input, | 6596 Variable* iterator, Variable* input, |
| 6651 Variable* var_output) { | 6597 Variable* var_output) { |
| 6652 // | 6598 // |
| 6653 // This function adds four statements to [statements], corresponding to the | 6599 // This function adds four statements to [statements], corresponding to the |
| 6654 // following code: | 6600 // following code: |
| 6655 // | 6601 // |
| 6656 // let iteratorReturn = iterator.return; | 6602 // let iteratorReturn = iterator.return; |
| 6657 // if (IS_NULL_OR_UNDEFINED(iteratorReturn) { | 6603 // if (IS_NULL_OR_UNDEFINED(iteratorReturn) { |
| 6658 // return {value: input, done: true}; | 6604 // return {value: input, done: true}; |
| 6659 // } | 6605 // } |
| 6660 // output = %_Call(iteratorReturn, iterator, input); | 6606 // output = %_Call(iteratorReturn, iterator, input); |
| 6661 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); | 6607 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); |
| 6662 // | 6608 // |
| 6663 | 6609 |
| 6664 const int nopos = kNoSourcePosition; | 6610 const int nopos = kNoSourcePosition; |
| 6665 auto factory = parser_->factory(); | |
| 6666 auto avfactory = parser_->ast_value_factory(); | |
| 6667 auto zone = parser_->zone(); | |
| 6668 | 6611 |
| 6669 // let iteratorReturn = iterator.return; | 6612 // let iteratorReturn = iterator.return; |
| 6670 Variable* var_return = var_output; // Reusing the output variable. | 6613 Variable* var_return = var_output; // Reusing the output variable. |
| 6671 Statement* get_return; | 6614 Statement* get_return; |
| 6672 { | 6615 { |
| 6673 Expression* iterator_proxy = factory->NewVariableProxy(iterator); | 6616 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 6674 Expression* literal = | 6617 Expression* literal = factory()->NewStringLiteral( |
| 6675 factory->NewStringLiteral(avfactory->return_string(), nopos); | 6618 ast_value_factory()->return_string(), nopos); |
| 6676 Expression* property = | 6619 Expression* property = |
| 6677 factory->NewProperty(iterator_proxy, literal, nopos); | 6620 factory()->NewProperty(iterator_proxy, literal, nopos); |
| 6678 Expression* return_proxy = factory->NewVariableProxy(var_return); | 6621 Expression* return_proxy = factory()->NewVariableProxy(var_return); |
| 6679 Expression* assignment = factory->NewAssignment( | 6622 Expression* assignment = |
| 6680 Token::ASSIGN, return_proxy, property, nopos); | 6623 factory()->NewAssignment(Token::ASSIGN, return_proxy, property, nopos); |
| 6681 get_return = factory->NewExpressionStatement(assignment, nopos); | 6624 get_return = factory()->NewExpressionStatement(assignment, nopos); |
| 6682 } | 6625 } |
| 6683 | 6626 |
| 6684 // if (IS_NULL_OR_UNDEFINED(iteratorReturn) { | 6627 // if (IS_NULL_OR_UNDEFINED(iteratorReturn) { |
| 6685 // return {value: input, done: true}; | 6628 // return {value: input, done: true}; |
| 6686 // } | 6629 // } |
| 6687 Statement* check_return; | 6630 Statement* check_return; |
| 6688 { | 6631 { |
| 6689 Expression* condition = factory->NewCompareOperation( | 6632 Expression* condition = factory()->NewCompareOperation( |
| 6690 Token::EQ, factory->NewVariableProxy(var_return), | 6633 Token::EQ, factory()->NewVariableProxy(var_return), |
| 6691 factory->NewNullLiteral(nopos), nopos); | 6634 factory()->NewNullLiteral(nopos), nopos); |
| 6692 | 6635 |
| 6693 Expression* value = factory->NewVariableProxy(input); | 6636 Expression* value = factory()->NewVariableProxy(input); |
| 6694 | 6637 |
| 6695 Statement* return_input = | 6638 Statement* return_input = |
| 6696 factory->NewReturnStatement(BuildIteratorResult(value, true), nopos); | 6639 factory()->NewReturnStatement(BuildIteratorResult(value, true), nopos); |
| 6697 | 6640 |
| 6698 check_return = factory->NewIfStatement( | 6641 check_return = factory()->NewIfStatement( |
| 6699 condition, return_input, factory->NewEmptyStatement(nopos), nopos); | 6642 condition, return_input, factory()->NewEmptyStatement(nopos), nopos); |
| 6700 } | 6643 } |
| 6701 | 6644 |
| 6702 // output = %_Call(iteratorReturn, iterator, input); | 6645 // output = %_Call(iteratorReturn, iterator, input); |
| 6703 Statement* call_return; | 6646 Statement* call_return; |
| 6704 { | 6647 { |
| 6705 auto args = new (zone) ZoneList<Expression*>(3, zone); | 6648 auto args = new (zone()) ZoneList<Expression*>(3, zone()); |
| 6706 args->Add(factory->NewVariableProxy(var_return), zone); | 6649 args->Add(factory()->NewVariableProxy(var_return), zone()); |
| 6707 args->Add(factory->NewVariableProxy(iterator), zone); | 6650 args->Add(factory()->NewVariableProxy(iterator), zone()); |
| 6708 args->Add(factory->NewVariableProxy(input), zone); | 6651 args->Add(factory()->NewVariableProxy(input), zone()); |
| 6709 | 6652 |
| 6710 Expression* call = | 6653 Expression* call = |
| 6711 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); | 6654 factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos); |
| 6712 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6655 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6713 Expression* assignment = factory->NewAssignment( | 6656 Expression* assignment = |
| 6714 Token::ASSIGN, output_proxy, call, nopos); | 6657 factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos); |
| 6715 call_return = factory->NewExpressionStatement(assignment, nopos); | 6658 call_return = factory()->NewExpressionStatement(assignment, nopos); |
| 6716 } | 6659 } |
| 6717 | 6660 |
| 6718 // if (!IS_RECEIVER(output)) %ThrowIteratorResultNotAnObject(output); | 6661 // if (!IS_RECEIVER(output)) %ThrowIteratorResultNotAnObject(output); |
| 6719 Statement* validate_output; | 6662 Statement* validate_output; |
| 6720 { | 6663 { |
| 6721 Expression* is_receiver_call; | 6664 Expression* is_receiver_call; |
| 6722 { | 6665 { |
| 6723 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6666 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6724 args->Add(factory->NewVariableProxy(var_output), zone); | 6667 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6725 is_receiver_call = | 6668 is_receiver_call = |
| 6726 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 6669 factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |
| 6727 } | 6670 } |
| 6728 | 6671 |
| 6729 Statement* throw_call; | 6672 Statement* throw_call; |
| 6730 { | 6673 { |
| 6731 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6674 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6732 args->Add(factory->NewVariableProxy(var_output), zone); | 6675 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6733 Expression* call = factory->NewCallRuntime( | 6676 Expression* call = factory()->NewCallRuntime( |
| 6734 Runtime::kThrowIteratorResultNotAnObject, args, nopos); | 6677 Runtime::kThrowIteratorResultNotAnObject, args, nopos); |
| 6735 throw_call = factory->NewExpressionStatement(call, nopos); | 6678 throw_call = factory()->NewExpressionStatement(call, nopos); |
| 6736 } | 6679 } |
| 6737 | 6680 |
| 6738 validate_output = factory->NewIfStatement( | 6681 validate_output = factory()->NewIfStatement( |
| 6739 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6682 is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call, |
| 6683 nopos); |
| 6740 } | 6684 } |
| 6741 | 6685 |
| 6742 statements->Add(get_return, zone); | 6686 statements->Add(get_return, zone()); |
| 6743 statements->Add(check_return, zone); | 6687 statements->Add(check_return, zone()); |
| 6744 statements->Add(call_return, zone); | 6688 statements->Add(call_return, zone()); |
| 6745 statements->Add(validate_output, zone); | 6689 statements->Add(validate_output, zone()); |
| 6746 } | 6690 } |
| 6747 | 6691 |
| 6748 void ParserTraits::FinalizeIteratorUse(Variable* completion, | 6692 void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition, |
| 6749 Expression* condition, Variable* iter, | 6693 Variable* iter, Block* iterator_use, |
| 6750 Block* iterator_use, Block* target) { | 6694 Block* target) { |
| 6751 // | 6695 // |
| 6752 // This function adds two statements to [target], corresponding to the | 6696 // This function adds two statements to [target], corresponding to the |
| 6753 // following code: | 6697 // following code: |
| 6754 // | 6698 // |
| 6755 // completion = kNormalCompletion; | 6699 // completion = kNormalCompletion; |
| 6756 // try { | 6700 // try { |
| 6757 // try { | 6701 // try { |
| 6758 // iterator_use | 6702 // iterator_use |
| 6759 // } catch(e) { | 6703 // } catch(e) { |
| 6760 // if (completion === kAbruptCompletion) completion = kThrowCompletion; | 6704 // if (completion === kAbruptCompletion) completion = kThrowCompletion; |
| 6761 // %ReThrow(e); | 6705 // %ReThrow(e); |
| 6762 // } | 6706 // } |
| 6763 // } finally { | 6707 // } finally { |
| 6764 // if (condition) { | 6708 // if (condition) { |
| 6765 // #BuildIteratorCloseForCompletion(iter, completion) | 6709 // #BuildIteratorCloseForCompletion(iter, completion) |
| 6766 // } | 6710 // } |
| 6767 // } | 6711 // } |
| 6768 // | 6712 // |
| 6769 | 6713 |
| 6770 const int nopos = kNoSourcePosition; | 6714 const int nopos = kNoSourcePosition; |
| 6771 auto factory = parser_->factory(); | |
| 6772 auto avfactory = parser_->ast_value_factory(); | |
| 6773 auto scope = parser_->scope(); | |
| 6774 auto zone = parser_->zone(); | |
| 6775 | 6715 |
| 6776 // completion = kNormalCompletion; | 6716 // completion = kNormalCompletion; |
| 6777 Statement* initialize_completion; | 6717 Statement* initialize_completion; |
| 6778 { | 6718 { |
| 6779 Expression* proxy = factory->NewVariableProxy(completion); | 6719 Expression* proxy = factory()->NewVariableProxy(completion); |
| 6780 Expression* assignment = factory->NewAssignment( | 6720 Expression* assignment = factory()->NewAssignment( |
| 6781 Token::ASSIGN, proxy, | 6721 Token::ASSIGN, proxy, |
| 6782 factory->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos); | 6722 factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos); |
| 6783 initialize_completion = factory->NewExpressionStatement(assignment, nopos); | 6723 initialize_completion = |
| 6724 factory()->NewExpressionStatement(assignment, nopos); |
| 6784 } | 6725 } |
| 6785 | 6726 |
| 6786 // if (completion === kAbruptCompletion) completion = kThrowCompletion; | 6727 // if (completion === kAbruptCompletion) completion = kThrowCompletion; |
| 6787 Statement* set_completion_throw; | 6728 Statement* set_completion_throw; |
| 6788 { | 6729 { |
| 6789 Expression* condition = factory->NewCompareOperation( | 6730 Expression* condition = factory()->NewCompareOperation( |
| 6790 Token::EQ_STRICT, factory->NewVariableProxy(completion), | 6731 Token::EQ_STRICT, factory()->NewVariableProxy(completion), |
| 6791 factory->NewSmiLiteral(Parser::kAbruptCompletion, nopos), nopos); | 6732 factory()->NewSmiLiteral(Parser::kAbruptCompletion, nopos), nopos); |
| 6792 | 6733 |
| 6793 Expression* proxy = factory->NewVariableProxy(completion); | 6734 Expression* proxy = factory()->NewVariableProxy(completion); |
| 6794 Expression* assignment = factory->NewAssignment( | 6735 Expression* assignment = factory()->NewAssignment( |
| 6795 Token::ASSIGN, proxy, | 6736 Token::ASSIGN, proxy, |
| 6796 factory->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos); | 6737 factory()->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos); |
| 6797 Statement* statement = factory->NewExpressionStatement(assignment, nopos); | 6738 Statement* statement = factory()->NewExpressionStatement(assignment, nopos); |
| 6798 set_completion_throw = factory->NewIfStatement( | 6739 set_completion_throw = factory()->NewIfStatement( |
| 6799 condition, statement, factory->NewEmptyStatement(nopos), nopos); | 6740 condition, statement, factory()->NewEmptyStatement(nopos), nopos); |
| 6800 } | 6741 } |
| 6801 | 6742 |
| 6802 // if (condition) { | 6743 // if (condition) { |
| 6803 // #BuildIteratorCloseForCompletion(iter, completion) | 6744 // #BuildIteratorCloseForCompletion(iter, completion) |
| 6804 // } | 6745 // } |
| 6805 Block* maybe_close; | 6746 Block* maybe_close; |
| 6806 { | 6747 { |
| 6807 Block* block = factory->NewBlock(nullptr, 2, true, nopos); | 6748 Block* block = factory()->NewBlock(nullptr, 2, true, nopos); |
| 6808 Expression* proxy = factory->NewVariableProxy(completion); | 6749 Expression* proxy = factory()->NewVariableProxy(completion); |
| 6809 parser_->BuildIteratorCloseForCompletion(block->statements(), iter, proxy); | 6750 BuildIteratorCloseForCompletion(block->statements(), iter, proxy); |
| 6810 DCHECK(block->statements()->length() == 2); | 6751 DCHECK(block->statements()->length() == 2); |
| 6811 | 6752 |
| 6812 maybe_close = factory->NewBlock(nullptr, 1, true, nopos); | 6753 maybe_close = factory()->NewBlock(nullptr, 1, true, nopos); |
| 6813 maybe_close->statements()->Add( | 6754 maybe_close->statements()->Add( |
| 6814 factory->NewIfStatement(condition, block, | 6755 factory()->NewIfStatement(condition, block, |
| 6815 factory->NewEmptyStatement(nopos), nopos), | 6756 factory()->NewEmptyStatement(nopos), nopos), |
| 6816 zone); | 6757 zone()); |
| 6817 } | 6758 } |
| 6818 | 6759 |
| 6819 // try { #try_block } | 6760 // try { #try_block } |
| 6820 // catch(e) { | 6761 // catch(e) { |
| 6821 // #set_completion_throw; | 6762 // #set_completion_throw; |
| 6822 // %ReThrow(e); | 6763 // %ReThrow(e); |
| 6823 // } | 6764 // } |
| 6824 Statement* try_catch; | 6765 Statement* try_catch; |
| 6825 { | 6766 { |
| 6826 Scope* catch_scope = parser_->NewScopeWithParent(scope, CATCH_SCOPE); | 6767 Scope* catch_scope = NewScopeWithParent(scope(), CATCH_SCOPE); |
| 6827 Variable* catch_variable = | 6768 Variable* catch_variable = |
| 6828 catch_scope->DeclareLocal(avfactory->dot_catch_string(), VAR, | 6769 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, |
| 6829 kCreatedInitialized, Variable::NORMAL); | 6770 kCreatedInitialized, Variable::NORMAL); |
| 6830 catch_scope->set_is_hidden(); | 6771 catch_scope->set_is_hidden(); |
| 6831 | 6772 |
| 6832 Statement* rethrow; | 6773 Statement* rethrow; |
| 6833 // We use %ReThrow rather than the ordinary throw because we want to | 6774 // We use %ReThrow rather than the ordinary throw because we want to |
| 6834 // preserve the original exception message. This is also why we create a | 6775 // preserve the original exception message. This is also why we create a |
| 6835 // TryCatchStatementForReThrow below (which does not clear the pending | 6776 // TryCatchStatementForReThrow below (which does not clear the pending |
| 6836 // message), rather than a TryCatchStatement. | 6777 // message), rather than a TryCatchStatement. |
| 6837 { | 6778 { |
| 6838 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6779 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6839 args->Add(factory->NewVariableProxy(catch_variable), zone); | 6780 args->Add(factory()->NewVariableProxy(catch_variable), zone()); |
| 6840 rethrow = factory->NewExpressionStatement( | 6781 rethrow = factory()->NewExpressionStatement( |
| 6841 factory->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos); | 6782 factory()->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos); |
| 6842 } | 6783 } |
| 6843 | 6784 |
| 6844 Block* catch_block = factory->NewBlock(nullptr, 2, false, nopos); | 6785 Block* catch_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 6845 catch_block->statements()->Add(set_completion_throw, zone); | 6786 catch_block->statements()->Add(set_completion_throw, zone()); |
| 6846 catch_block->statements()->Add(rethrow, zone); | 6787 catch_block->statements()->Add(rethrow, zone()); |
| 6847 | 6788 |
| 6848 try_catch = factory->NewTryCatchStatementForReThrow( | 6789 try_catch = factory()->NewTryCatchStatementForReThrow( |
| 6849 iterator_use, catch_scope, catch_variable, catch_block, nopos); | 6790 iterator_use, catch_scope, catch_variable, catch_block, nopos); |
| 6850 } | 6791 } |
| 6851 | 6792 |
| 6852 // try { #try_catch } finally { #maybe_close } | 6793 // try { #try_catch } finally { #maybe_close } |
| 6853 Statement* try_finally; | 6794 Statement* try_finally; |
| 6854 { | 6795 { |
| 6855 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); | 6796 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 6856 try_block->statements()->Add(try_catch, zone); | 6797 try_block->statements()->Add(try_catch, zone()); |
| 6857 | 6798 |
| 6858 try_finally = | 6799 try_finally = |
| 6859 factory->NewTryFinallyStatement(try_block, maybe_close, nopos); | 6800 factory()->NewTryFinallyStatement(try_block, maybe_close, nopos); |
| 6860 } | 6801 } |
| 6861 | 6802 |
| 6862 target->statements()->Add(initialize_completion, zone); | 6803 target->statements()->Add(initialize_completion, zone()); |
| 6863 target->statements()->Add(try_finally, zone); | 6804 target->statements()->Add(try_finally, zone()); |
| 6864 } | 6805 } |
| 6865 | 6806 |
| 6866 void ParserTraits::BuildIteratorCloseForCompletion( | 6807 void Parser::BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements, |
| 6867 ZoneList<Statement*>* statements, Variable* iterator, | 6808 Variable* iterator, |
| 6868 Expression* completion) { | 6809 Expression* completion) { |
| 6869 // | 6810 // |
| 6870 // This function adds two statements to [statements], corresponding to the | 6811 // This function adds two statements to [statements], corresponding to the |
| 6871 // following code: | 6812 // following code: |
| 6872 // | 6813 // |
| 6873 // let iteratorReturn = iterator.return; | 6814 // let iteratorReturn = iterator.return; |
| 6874 // if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) { | 6815 // if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) { |
| 6875 // if (completion === kThrowCompletion) { | 6816 // if (completion === kThrowCompletion) { |
| 6876 // if (!IS_CALLABLE(iteratorReturn)) { | 6817 // if (!IS_CALLABLE(iteratorReturn)) { |
| 6877 // throw MakeTypeError(kReturnMethodNotCallable); | 6818 // throw MakeTypeError(kReturnMethodNotCallable); |
| 6878 // } | 6819 // } |
| 6879 // try { %_Call(iteratorReturn, iterator) } catch (_) { } | 6820 // try { %_Call(iteratorReturn, iterator) } catch (_) { } |
| 6880 // } else { | 6821 // } else { |
| 6881 // let output = %_Call(iteratorReturn, iterator); | 6822 // let output = %_Call(iteratorReturn, iterator); |
| 6882 // if (!IS_RECEIVER(output)) { | 6823 // if (!IS_RECEIVER(output)) { |
| 6883 // %ThrowIterResultNotAnObject(output); | 6824 // %ThrowIterResultNotAnObject(output); |
| 6884 // } | 6825 // } |
| 6885 // } | 6826 // } |
| 6886 // } | 6827 // } |
| 6887 // | 6828 // |
| 6888 | 6829 |
| 6889 const int nopos = kNoSourcePosition; | 6830 const int nopos = kNoSourcePosition; |
| 6890 auto factory = parser_->factory(); | |
| 6891 auto avfactory = parser_->ast_value_factory(); | |
| 6892 auto zone = parser_->zone(); | |
| 6893 | |
| 6894 | |
| 6895 // let iteratorReturn = iterator.return; | 6831 // let iteratorReturn = iterator.return; |
| 6896 Variable* var_return = parser_->NewTemporary(avfactory->empty_string()); | 6832 Variable* var_return = NewTemporary(ast_value_factory()->empty_string()); |
| 6897 Statement* get_return; | 6833 Statement* get_return; |
| 6898 { | 6834 { |
| 6899 Expression* iterator_proxy = factory->NewVariableProxy(iterator); | 6835 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 6900 Expression* literal = | 6836 Expression* literal = factory()->NewStringLiteral( |
| 6901 factory->NewStringLiteral(avfactory->return_string(), nopos); | 6837 ast_value_factory()->return_string(), nopos); |
| 6902 Expression* property = | 6838 Expression* property = |
| 6903 factory->NewProperty(iterator_proxy, literal, nopos); | 6839 factory()->NewProperty(iterator_proxy, literal, nopos); |
| 6904 Expression* return_proxy = factory->NewVariableProxy(var_return); | 6840 Expression* return_proxy = factory()->NewVariableProxy(var_return); |
| 6905 Expression* assignment = factory->NewAssignment( | 6841 Expression* assignment = |
| 6906 Token::ASSIGN, return_proxy, property, nopos); | 6842 factory()->NewAssignment(Token::ASSIGN, return_proxy, property, nopos); |
| 6907 get_return = factory->NewExpressionStatement(assignment, nopos); | 6843 get_return = factory()->NewExpressionStatement(assignment, nopos); |
| 6908 } | 6844 } |
| 6909 | 6845 |
| 6910 // if (!IS_CALLABLE(iteratorReturn)) { | 6846 // if (!IS_CALLABLE(iteratorReturn)) { |
| 6911 // throw MakeTypeError(kReturnMethodNotCallable); | 6847 // throw MakeTypeError(kReturnMethodNotCallable); |
| 6912 // } | 6848 // } |
| 6913 Statement* check_return_callable; | 6849 Statement* check_return_callable; |
| 6914 { | 6850 { |
| 6915 Expression* throw_expr = NewThrowTypeError( | 6851 Expression* throw_expr = |
| 6916 MessageTemplate::kReturnMethodNotCallable, | 6852 NewThrowTypeError(MessageTemplate::kReturnMethodNotCallable, |
| 6917 avfactory->empty_string(), nopos); | 6853 ast_value_factory()->empty_string(), nopos); |
| 6918 check_return_callable = CheckCallable(var_return, throw_expr, nopos); | 6854 check_return_callable = CheckCallable(var_return, throw_expr, nopos); |
| 6919 } | 6855 } |
| 6920 | 6856 |
| 6921 // try { %_Call(iteratorReturn, iterator) } catch (_) { } | 6857 // try { %_Call(iteratorReturn, iterator) } catch (_) { } |
| 6922 Statement* try_call_return; | 6858 Statement* try_call_return; |
| 6923 { | 6859 { |
| 6924 auto args = new (zone) ZoneList<Expression*>(2, zone); | 6860 auto args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 6925 args->Add(factory->NewVariableProxy(var_return), zone); | 6861 args->Add(factory()->NewVariableProxy(var_return), zone()); |
| 6926 args->Add(factory->NewVariableProxy(iterator), zone); | 6862 args->Add(factory()->NewVariableProxy(iterator), zone()); |
| 6927 | 6863 |
| 6928 Expression* call = | 6864 Expression* call = |
| 6929 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); | 6865 factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos); |
| 6930 | 6866 |
| 6931 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); | 6867 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 6932 try_block->statements()->Add(factory->NewExpressionStatement(call, nopos), | 6868 try_block->statements()->Add(factory()->NewExpressionStatement(call, nopos), |
| 6933 zone); | 6869 zone()); |
| 6934 | 6870 |
| 6935 Block* catch_block = factory->NewBlock(nullptr, 0, false, nopos); | 6871 Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos); |
| 6936 | 6872 |
| 6937 Scope* catch_scope = NewScope(CATCH_SCOPE); | 6873 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 6938 Variable* catch_variable = catch_scope->DeclareLocal( | 6874 Variable* catch_variable = |
| 6939 avfactory->dot_catch_string(), VAR, kCreatedInitialized, | 6875 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, |
| 6940 Variable::NORMAL); | 6876 kCreatedInitialized, Variable::NORMAL); |
| 6941 catch_scope->set_is_hidden(); | 6877 catch_scope->set_is_hidden(); |
| 6942 | 6878 |
| 6943 try_call_return = factory->NewTryCatchStatement( | 6879 try_call_return = factory()->NewTryCatchStatement( |
| 6944 try_block, catch_scope, catch_variable, catch_block, nopos); | 6880 try_block, catch_scope, catch_variable, catch_block, nopos); |
| 6945 } | 6881 } |
| 6946 | 6882 |
| 6947 // let output = %_Call(iteratorReturn, iterator); | 6883 // let output = %_Call(iteratorReturn, iterator); |
| 6948 // if (!IS_RECEIVER(output)) { | 6884 // if (!IS_RECEIVER(output)) { |
| 6949 // %ThrowIteratorResultNotAnObject(output); | 6885 // %ThrowIteratorResultNotAnObject(output); |
| 6950 // } | 6886 // } |
| 6951 Block* validate_return; | 6887 Block* validate_return; |
| 6952 { | 6888 { |
| 6953 Variable* var_output = parser_->NewTemporary(avfactory->empty_string()); | 6889 Variable* var_output = NewTemporary(ast_value_factory()->empty_string()); |
| 6954 Statement* call_return; | 6890 Statement* call_return; |
| 6955 { | 6891 { |
| 6956 auto args = new (zone) ZoneList<Expression*>(2, zone); | 6892 auto args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 6957 args->Add(factory->NewVariableProxy(var_return), zone); | 6893 args->Add(factory()->NewVariableProxy(var_return), zone()); |
| 6958 args->Add(factory->NewVariableProxy(iterator), zone); | 6894 args->Add(factory()->NewVariableProxy(iterator), zone()); |
| 6959 Expression* call = | 6895 Expression* call = |
| 6960 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); | 6896 factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos); |
| 6961 | 6897 |
| 6962 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6898 Expression* output_proxy = factory()->NewVariableProxy(var_output); |
| 6963 Expression* assignment = | 6899 Expression* assignment = |
| 6964 factory->NewAssignment(Token::ASSIGN, output_proxy, call, nopos); | 6900 factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos); |
| 6965 call_return = factory->NewExpressionStatement(assignment, nopos); | 6901 call_return = factory()->NewExpressionStatement(assignment, nopos); |
| 6966 } | 6902 } |
| 6967 | 6903 |
| 6968 Expression* is_receiver_call; | 6904 Expression* is_receiver_call; |
| 6969 { | 6905 { |
| 6970 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6906 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6971 args->Add(factory->NewVariableProxy(var_output), zone); | 6907 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6972 is_receiver_call = | 6908 is_receiver_call = |
| 6973 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 6909 factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |
| 6974 } | 6910 } |
| 6975 | 6911 |
| 6976 Statement* throw_call; | 6912 Statement* throw_call; |
| 6977 { | 6913 { |
| 6978 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6914 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 6979 args->Add(factory->NewVariableProxy(var_output), zone); | 6915 args->Add(factory()->NewVariableProxy(var_output), zone()); |
| 6980 Expression* call = factory->NewCallRuntime( | 6916 Expression* call = factory()->NewCallRuntime( |
| 6981 Runtime::kThrowIteratorResultNotAnObject, args, nopos); | 6917 Runtime::kThrowIteratorResultNotAnObject, args, nopos); |
| 6982 throw_call = factory->NewExpressionStatement(call, nopos); | 6918 throw_call = factory()->NewExpressionStatement(call, nopos); |
| 6983 } | 6919 } |
| 6984 | 6920 |
| 6985 Statement* check_return = factory->NewIfStatement( | 6921 Statement* check_return = factory()->NewIfStatement( |
| 6986 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6922 is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call, |
| 6923 nopos); |
| 6987 | 6924 |
| 6988 validate_return = factory->NewBlock(nullptr, 2, false, nopos); | 6925 validate_return = factory()->NewBlock(nullptr, 2, false, nopos); |
| 6989 validate_return->statements()->Add(call_return, zone); | 6926 validate_return->statements()->Add(call_return, zone()); |
| 6990 validate_return->statements()->Add(check_return, zone); | 6927 validate_return->statements()->Add(check_return, zone()); |
| 6991 } | 6928 } |
| 6992 | 6929 |
| 6993 // if (completion === kThrowCompletion) { | 6930 // if (completion === kThrowCompletion) { |
| 6994 // #check_return_callable; | 6931 // #check_return_callable; |
| 6995 // #try_call_return; | 6932 // #try_call_return; |
| 6996 // } else { | 6933 // } else { |
| 6997 // #validate_return; | 6934 // #validate_return; |
| 6998 // } | 6935 // } |
| 6999 Statement* call_return_carefully; | 6936 Statement* call_return_carefully; |
| 7000 { | 6937 { |
| 7001 Expression* condition = factory->NewCompareOperation( | 6938 Expression* condition = factory()->NewCompareOperation( |
| 7002 Token::EQ_STRICT, completion, | 6939 Token::EQ_STRICT, completion, |
| 7003 factory->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos); | 6940 factory()->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos); |
| 7004 | 6941 |
| 7005 Block* then_block = factory->NewBlock(nullptr, 2, false, nopos); | 6942 Block* then_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 7006 then_block->statements()->Add(check_return_callable, zone); | 6943 then_block->statements()->Add(check_return_callable, zone()); |
| 7007 then_block->statements()->Add(try_call_return, zone); | 6944 then_block->statements()->Add(try_call_return, zone()); |
| 7008 | 6945 |
| 7009 call_return_carefully = | 6946 call_return_carefully = factory()->NewIfStatement(condition, then_block, |
| 7010 factory->NewIfStatement(condition, then_block, validate_return, nopos); | 6947 validate_return, nopos); |
| 7011 } | 6948 } |
| 7012 | 6949 |
| 7013 // if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) { ... } | 6950 // if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) { ... } |
| 7014 Statement* maybe_call_return; | 6951 Statement* maybe_call_return; |
| 7015 { | 6952 { |
| 7016 Expression* condition = factory->NewCompareOperation( | 6953 Expression* condition = factory()->NewCompareOperation( |
| 7017 Token::EQ, factory->NewVariableProxy(var_return), | 6954 Token::EQ, factory()->NewVariableProxy(var_return), |
| 7018 factory->NewNullLiteral(nopos), nopos); | 6955 factory()->NewNullLiteral(nopos), nopos); |
| 7019 | 6956 |
| 7020 maybe_call_return = | 6957 maybe_call_return = factory()->NewIfStatement( |
| 7021 factory->NewIfStatement(condition, factory->NewEmptyStatement(nopos), | 6958 condition, factory()->NewEmptyStatement(nopos), call_return_carefully, |
| 7022 call_return_carefully, nopos); | 6959 nopos); |
| 7023 } | 6960 } |
| 7024 | 6961 |
| 7025 | 6962 statements->Add(get_return, zone()); |
| 7026 statements->Add(get_return, zone); | 6963 statements->Add(maybe_call_return, zone()); |
| 7027 statements->Add(maybe_call_return, zone); | |
| 7028 } | 6964 } |
| 7029 | 6965 |
| 7030 Statement* ParserTraits::FinalizeForOfStatement(ForOfStatement* loop, | 6966 Statement* Parser::FinalizeForOfStatement(ForOfStatement* loop, |
| 7031 Variable* var_completion, | 6967 Variable* var_completion, int pos) { |
| 7032 int pos) { | |
| 7033 // | 6968 // |
| 7034 // This function replaces the loop with the following wrapping: | 6969 // This function replaces the loop with the following wrapping: |
| 7035 // | 6970 // |
| 7036 // completion = kNormalCompletion; | 6971 // completion = kNormalCompletion; |
| 7037 // try { | 6972 // try { |
| 7038 // try { | 6973 // try { |
| 7039 // #loop; | 6974 // #loop; |
| 7040 // } catch(e) { | 6975 // } catch(e) { |
| 7041 // if (completion === kAbruptCompletion) completion = kThrowCompletion; | 6976 // if (completion === kAbruptCompletion) completion = kThrowCompletion; |
| 7042 // %ReThrow(e); | 6977 // %ReThrow(e); |
| 7043 // } | 6978 // } |
| 7044 // } finally { | 6979 // } finally { |
| 7045 // if (!(completion === kNormalCompletion || IS_UNDEFINED(#iterator))) { | 6980 // if (!(completion === kNormalCompletion || IS_UNDEFINED(#iterator))) { |
| 7046 // #BuildIteratorCloseForCompletion(#iterator, completion) | 6981 // #BuildIteratorCloseForCompletion(#iterator, completion) |
| 7047 // } | 6982 // } |
| 7048 // } | 6983 // } |
| 7049 // | 6984 // |
| 7050 // Note that the loop's body and its assign_each already contain appropriate | 6985 // Note that the loop's body and its assign_each already contain appropriate |
| 7051 // assignments to completion (see InitializeForOfStatement). | 6986 // assignments to completion (see InitializeForOfStatement). |
| 7052 // | 6987 // |
| 7053 | 6988 |
| 7054 const int nopos = kNoSourcePosition; | 6989 const int nopos = kNoSourcePosition; |
| 7055 auto factory = parser_->factory(); | |
| 7056 auto zone = parser_->zone(); | |
| 7057 | 6990 |
| 7058 // !(completion === kNormalCompletion || IS_UNDEFINED(#iterator)) | 6991 // !(completion === kNormalCompletion || IS_UNDEFINED(#iterator)) |
| 7059 Expression* closing_condition; | 6992 Expression* closing_condition; |
| 7060 { | 6993 { |
| 7061 Expression* lhs = factory->NewCompareOperation( | 6994 Expression* lhs = factory()->NewCompareOperation( |
| 7062 Token::EQ_STRICT, factory->NewVariableProxy(var_completion), | 6995 Token::EQ_STRICT, factory()->NewVariableProxy(var_completion), |
| 7063 factory->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos); | 6996 factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos); |
| 7064 Expression* rhs = factory->NewCompareOperation( | 6997 Expression* rhs = factory()->NewCompareOperation( |
| 7065 Token::EQ_STRICT, factory->NewVariableProxy(loop->iterator()), | 6998 Token::EQ_STRICT, factory()->NewVariableProxy(loop->iterator()), |
| 7066 factory->NewUndefinedLiteral(nopos), nopos); | 6999 factory()->NewUndefinedLiteral(nopos), nopos); |
| 7067 closing_condition = factory->NewUnaryOperation( | 7000 closing_condition = factory()->NewUnaryOperation( |
| 7068 Token::NOT, factory->NewBinaryOperation(Token::OR, lhs, rhs, nopos), | 7001 Token::NOT, factory()->NewBinaryOperation(Token::OR, lhs, rhs, nopos), |
| 7069 nopos); | 7002 nopos); |
| 7070 } | 7003 } |
| 7071 | 7004 |
| 7072 Block* final_loop = factory->NewBlock(nullptr, 2, false, nopos); | 7005 Block* final_loop = factory()->NewBlock(nullptr, 2, false, nopos); |
| 7073 { | 7006 { |
| 7074 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); | 7007 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 7075 try_block->statements()->Add(loop, zone); | 7008 try_block->statements()->Add(loop, zone()); |
| 7076 | 7009 |
| 7077 FinalizeIteratorUse(var_completion, closing_condition, loop->iterator(), | 7010 FinalizeIteratorUse(var_completion, closing_condition, loop->iterator(), |
| 7078 try_block, final_loop); | 7011 try_block, final_loop); |
| 7079 } | 7012 } |
| 7080 | 7013 |
| 7081 return final_loop; | 7014 return final_loop; |
| 7082 } | 7015 } |
| 7083 | 7016 |
| 7084 #ifdef DEBUG | 7017 #ifdef DEBUG |
| 7085 void Parser::Print(AstNode* node) { | 7018 void Parser::Print(AstNode* node) { |
| 7086 ast_value_factory()->Internalize(Isolate::Current()); | 7019 ast_value_factory()->Internalize(Isolate::Current()); |
| 7087 node->Print(Isolate::Current()); | 7020 node->Print(Isolate::Current()); |
| 7088 } | 7021 } |
| 7089 #endif // DEBUG | 7022 #endif // DEBUG |
| 7090 | 7023 |
| 7091 #undef CHECK_OK | 7024 #undef CHECK_OK |
| 7092 #undef CHECK_OK_VOID | 7025 #undef CHECK_OK_VOID |
| 7093 #undef CHECK_FAILED | 7026 #undef CHECK_FAILED |
| 7094 | 7027 |
| 7095 } // namespace internal | 7028 } // namespace internal |
| 7096 } // namespace v8 | 7029 } // namespace v8 |
| OLD | NEW |