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 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 char array[100]; | 683 char array[100]; |
684 const char* string = DoubleToCString(double_value, ArrayVector(array)); | 684 const char* string = DoubleToCString(double_value, ArrayVector(array)); |
685 return parser_->ast_value_factory()->GetOneByteString(string); | 685 return parser_->ast_value_factory()->GetOneByteString(string); |
686 } | 686 } |
687 | 687 |
688 | 688 |
689 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 689 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { |
690 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); | 690 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); |
691 } | 691 } |
692 | 692 |
693 | 693 Expression* ParserTraits::ThisExpression(AstNodeFactory* factory, int pos) { |
694 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, | 694 return parser_->scope()->NewUnresolved( |
695 int pos) { | 695 factory, parser_->ast_value_factory()->this_string(), Variable::THIS, pos, |
696 return scope->NewUnresolved(factory, | 696 pos + 4); |
697 parser_->ast_value_factory()->this_string(), | |
698 Variable::THIS, pos, pos + 4); | |
699 } | 697 } |
700 | 698 |
701 Expression* ParserTraits::NewSuperPropertyReference(Scope* scope, | 699 Expression* ParserTraits::NewSuperPropertyReference(AstNodeFactory* factory, |
702 AstNodeFactory* factory, | |
703 int pos) { | 700 int pos) { |
704 // this_function[home_object_symbol] | 701 // this_function[home_object_symbol] |
705 VariableProxy* this_function_proxy = scope->NewUnresolved( | 702 VariableProxy* this_function_proxy = parser_->scope()->NewUnresolved( |
706 factory, parser_->ast_value_factory()->this_function_string(), | 703 factory, parser_->ast_value_factory()->this_function_string(), |
707 Variable::NORMAL, pos); | 704 Variable::NORMAL, pos); |
708 Expression* home_object_symbol_literal = | 705 Expression* home_object_symbol_literal = |
709 factory->NewSymbolLiteral("home_object_symbol", kNoSourcePosition); | 706 factory->NewSymbolLiteral("home_object_symbol", kNoSourcePosition); |
710 Expression* home_object = factory->NewProperty( | 707 Expression* home_object = factory->NewProperty( |
711 this_function_proxy, home_object_symbol_literal, pos); | 708 this_function_proxy, home_object_symbol_literal, pos); |
712 return factory->NewSuperPropertyReference( | 709 return factory->NewSuperPropertyReference( |
713 ThisExpression(scope, factory, pos)->AsVariableProxy(), home_object, pos); | 710 ThisExpression(factory, pos)->AsVariableProxy(), home_object, pos); |
714 } | 711 } |
715 | 712 |
716 Expression* ParserTraits::NewSuperCallReference(Scope* scope, | 713 Expression* ParserTraits::NewSuperCallReference(AstNodeFactory* factory, |
717 AstNodeFactory* factory, | |
718 int pos) { | 714 int pos) { |
719 VariableProxy* new_target_proxy = scope->NewUnresolved( | 715 VariableProxy* new_target_proxy = parser_->scope()->NewUnresolved( |
720 factory, parser_->ast_value_factory()->new_target_string(), | 716 factory, parser_->ast_value_factory()->new_target_string(), |
721 Variable::NORMAL, pos); | 717 Variable::NORMAL, pos); |
722 VariableProxy* this_function_proxy = scope->NewUnresolved( | 718 VariableProxy* this_function_proxy = parser_->scope()->NewUnresolved( |
723 factory, parser_->ast_value_factory()->this_function_string(), | 719 factory, parser_->ast_value_factory()->this_function_string(), |
724 Variable::NORMAL, pos); | 720 Variable::NORMAL, pos); |
725 return factory->NewSuperCallReference( | 721 return factory->NewSuperCallReference( |
726 ThisExpression(scope, factory, pos)->AsVariableProxy(), new_target_proxy, | 722 ThisExpression(factory, pos)->AsVariableProxy(), new_target_proxy, |
727 this_function_proxy, pos); | 723 this_function_proxy, pos); |
728 } | 724 } |
729 | 725 |
730 | 726 Expression* ParserTraits::NewTargetExpression(AstNodeFactory* factory, |
731 Expression* ParserTraits::NewTargetExpression(Scope* scope, | |
732 AstNodeFactory* factory, | |
733 int pos) { | 727 int pos) { |
734 static const int kNewTargetStringLength = 10; | 728 static const int kNewTargetStringLength = 10; |
735 auto proxy = scope->NewUnresolved( | 729 auto proxy = parser_->scope()->NewUnresolved( |
736 factory, parser_->ast_value_factory()->new_target_string(), | 730 factory, parser_->ast_value_factory()->new_target_string(), |
737 Variable::NORMAL, pos, pos + kNewTargetStringLength); | 731 Variable::NORMAL, pos, pos + kNewTargetStringLength); |
738 proxy->set_is_new_target(); | 732 proxy->set_is_new_target(); |
739 return proxy; | 733 return proxy; |
740 } | 734 } |
741 | 735 |
742 | 736 Expression* ParserTraits::FunctionSentExpression(AstNodeFactory* factory, |
743 Expression* ParserTraits::FunctionSentExpression(Scope* scope, | |
744 AstNodeFactory* factory, | |
745 int pos) { | 737 int pos) { |
746 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). | 738 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). |
747 Zone* zone = parser_->zone(); | 739 Zone* zone = parser_->zone(); |
748 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(1, zone); | 740 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(1, zone); |
749 VariableProxy* generator = factory->NewVariableProxy( | 741 VariableProxy* generator = factory->NewVariableProxy( |
750 parser_->function_state_->generator_object_variable()); | 742 parser_->function_state_->generator_object_variable()); |
751 args->Add(generator, zone); | 743 args->Add(generator, zone); |
752 return factory->NewCallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos, | 744 return factory->NewCallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos, |
753 args, pos); | 745 args, pos); |
754 } | 746 } |
(...skipping 21 matching lines...) Expand all Loading... |
776 default: | 768 default: |
777 DCHECK(false); | 769 DCHECK(false); |
778 } | 770 } |
779 return NULL; | 771 return NULL; |
780 } | 772 } |
781 | 773 |
782 | 774 |
783 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, | 775 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, |
784 int start_position, | 776 int start_position, |
785 int end_position, | 777 int end_position, |
786 Scope* scope, | |
787 AstNodeFactory* factory) { | 778 AstNodeFactory* factory) { |
788 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); | 779 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); |
789 return scope->NewUnresolved(factory, name, Variable::NORMAL, start_position, | 780 return parser_->scope()->NewUnresolved(factory, name, Variable::NORMAL, |
790 end_position); | 781 start_position, end_position); |
791 } | 782 } |
792 | 783 |
793 | 784 |
794 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, | 785 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, |
795 AstNodeFactory* factory) { | 786 AstNodeFactory* factory) { |
796 const AstRawString* symbol = GetSymbol(scanner); | 787 const AstRawString* symbol = GetSymbol(scanner); |
797 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); | 788 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); |
798 return factory->NewStringLiteral(symbol, pos); | 789 return factory->NewStringLiteral(symbol, pos); |
799 } | 790 } |
800 | 791 |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 if ((e_stat = stat->AsExpressionStatement()) != NULL && | 1294 if ((e_stat = stat->AsExpressionStatement()) != NULL && |
1304 (literal = e_stat->expression()->AsLiteral()) != NULL && | 1295 (literal = e_stat->expression()->AsLiteral()) != NULL && |
1305 literal->raw_value()->IsString()) { | 1296 literal->raw_value()->IsString()) { |
1306 // Check "use strict" directive (ES5 14.1), "use asm" directive. | 1297 // Check "use strict" directive (ES5 14.1), "use asm" directive. |
1307 bool use_strict_found = | 1298 bool use_strict_found = |
1308 literal->raw_value()->AsString() == | 1299 literal->raw_value()->AsString() == |
1309 ast_value_factory()->use_strict_string() && | 1300 ast_value_factory()->use_strict_string() && |
1310 token_loc.end_pos - token_loc.beg_pos == | 1301 token_loc.end_pos - token_loc.beg_pos == |
1311 ast_value_factory()->use_strict_string()->length() + 2; | 1302 ast_value_factory()->use_strict_string()->length() + 2; |
1312 if (use_strict_found) { | 1303 if (use_strict_found) { |
1313 if (is_sloppy(this->scope()->language_mode())) { | 1304 if (is_sloppy(language_mode())) { |
1314 RaiseLanguageMode(STRICT); | 1305 RaiseLanguageMode(STRICT); |
1315 } | 1306 } |
1316 | 1307 |
1317 if (!this->scope()->HasSimpleParameters()) { | 1308 if (!this->scope()->HasSimpleParameters()) { |
1318 // TC39 deemed "use strict" directives to be an error when occurring | 1309 // TC39 deemed "use strict" directives to be an error when occurring |
1319 // in the body of a function with non-simple parameter list, on | 1310 // in the body of a function with non-simple parameter list, on |
1320 // 29/7/2015. https://goo.gl/ueA7Ln | 1311 // 29/7/2015. https://goo.gl/ueA7Ln |
1321 const AstRawString* string = literal->raw_value()->AsString(); | 1312 const AstRawString* string = literal->raw_value()->AsString(); |
1322 ParserTraits::ReportMessageAt( | 1313 ParserTraits::ReportMessageAt( |
1323 token_loc, MessageTemplate::kIllegalLanguageModeDirective, | 1314 token_loc, MessageTemplate::kIllegalLanguageModeDirective, |
(...skipping 1439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2763 Scanner::Location loc = scanner()->location(); | 2754 Scanner::Location loc = scanner()->location(); |
2764 | 2755 |
2765 Token::Value tok = peek(); | 2756 Token::Value tok = peek(); |
2766 Statement* result; | 2757 Statement* result; |
2767 Expression* return_value; | 2758 Expression* return_value; |
2768 if (scanner()->HasAnyLineTerminatorBeforeNext() || | 2759 if (scanner()->HasAnyLineTerminatorBeforeNext() || |
2769 tok == Token::SEMICOLON || | 2760 tok == Token::SEMICOLON || |
2770 tok == Token::RBRACE || | 2761 tok == Token::RBRACE || |
2771 tok == Token::EOS) { | 2762 tok == Token::EOS) { |
2772 if (IsSubclassConstructor(function_state_->kind())) { | 2763 if (IsSubclassConstructor(function_state_->kind())) { |
2773 return_value = ThisExpression(scope(), factory(), loc.beg_pos); | 2764 return_value = ThisExpression(factory(), loc.beg_pos); |
2774 } else { | 2765 } else { |
2775 return_value = GetLiteralUndefined(position()); | 2766 return_value = GetLiteralUndefined(position()); |
2776 } | 2767 } |
2777 } else { | 2768 } else { |
2778 int pos = peek_position(); | 2769 int pos = peek_position(); |
2779 | 2770 |
2780 if (IsSubclassConstructor(function_state_->kind())) { | 2771 if (IsSubclassConstructor(function_state_->kind())) { |
2781 // Because of the return code rewriting that happens in case of a subclass | 2772 // Because of the return code rewriting that happens in case of a subclass |
2782 // constructor we don't want to accept tail calls, therefore we don't set | 2773 // constructor we don't want to accept tail calls, therefore we don't set |
2783 // ReturnExprScope to kInsideValidReturnStatement here. | 2774 // ReturnExprScope to kInsideValidReturnStatement here. |
(...skipping 27 matching lines...) Expand all Loading... |
2811 Expression* is_object_conditional = factory()->NewConditional( | 2802 Expression* is_object_conditional = factory()->NewConditional( |
2812 is_spec_object_call, factory()->NewVariableProxy(temp), | 2803 is_spec_object_call, factory()->NewVariableProxy(temp), |
2813 factory()->NewSmiLiteral(1, pos), pos); | 2804 factory()->NewSmiLiteral(1, pos), pos); |
2814 | 2805 |
2815 // temp === undefined | 2806 // temp === undefined |
2816 Expression* is_undefined = factory()->NewCompareOperation( | 2807 Expression* is_undefined = factory()->NewCompareOperation( |
2817 Token::EQ_STRICT, assign, | 2808 Token::EQ_STRICT, assign, |
2818 factory()->NewUndefinedLiteral(kNoSourcePosition), pos); | 2809 factory()->NewUndefinedLiteral(kNoSourcePosition), pos); |
2819 | 2810 |
2820 // is_undefined ? this : is_object_conditional | 2811 // is_undefined ? this : is_object_conditional |
2821 return_value = factory()->NewConditional( | 2812 return_value = factory()->NewConditional(is_undefined, |
2822 is_undefined, ThisExpression(scope(), factory(), pos), | 2813 ThisExpression(factory(), pos), |
2823 is_object_conditional, pos); | 2814 is_object_conditional, pos); |
2824 } else { | 2815 } else { |
2825 ReturnExprScope maybe_allow_tail_calls( | 2816 ReturnExprScope maybe_allow_tail_calls( |
2826 function_state_, ReturnExprContext::kInsideValidReturnStatement); | 2817 function_state_, ReturnExprContext::kInsideValidReturnStatement); |
2827 return_value = ParseExpression(true, CHECK_OK); | 2818 return_value = ParseExpression(true, CHECK_OK); |
2828 | 2819 |
2829 if (allow_tailcalls() && !is_sloppy(language_mode())) { | 2820 if (allow_tailcalls() && !is_sloppy(language_mode())) { |
2830 // ES6 14.6.1 Static Semantics: IsInTailPosition | 2821 // ES6 14.6.1 Static Semantics: IsInTailPosition |
2831 function_state_->AddImplicitTailCallExpression(return_value); | 2822 function_state_->AddImplicitTailCallExpression(return_value); |
2832 } | 2823 } |
2833 } | 2824 } |
(...skipping 1812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4646 scope()->RecordSuperPropertyUsage(); | 4637 scope()->RecordSuperPropertyUsage(); |
4647 } | 4638 } |
4648 if (logger.calls_eval()) { | 4639 if (logger.calls_eval()) { |
4649 scope()->RecordEvalCall(); | 4640 scope()->RecordEvalCall(); |
4650 } | 4641 } |
4651 if (produce_cached_parse_data()) { | 4642 if (produce_cached_parse_data()) { |
4652 DCHECK(log_); | 4643 DCHECK(log_); |
4653 // Position right after terminal '}'. | 4644 // Position right after terminal '}'. |
4654 int body_end = scanner()->location().end_pos; | 4645 int body_end = scanner()->location().end_pos; |
4655 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, | 4646 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, |
4656 *expected_property_count, scope()->language_mode(), | 4647 *expected_property_count, language_mode(), |
4657 scope()->uses_super_property(), scope()->calls_eval()); | 4648 scope()->uses_super_property(), scope()->calls_eval()); |
4658 } | 4649 } |
4659 } | 4650 } |
4660 | 4651 |
4661 | 4652 |
4662 Statement* Parser::BuildAssertIsCoercible(Variable* var) { | 4653 Statement* Parser::BuildAssertIsCoercible(Variable* var) { |
4663 // if (var === null || var === undefined) | 4654 // if (var === null || var === undefined) |
4664 // throw /* type error kNonCoercible) */; | 4655 // throw /* type error kNonCoercible) */; |
4665 | 4656 |
4666 Expression* condition = factory()->NewBinaryOperation( | 4657 Expression* condition = factory()->NewBinaryOperation( |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4821 block->statements()->Add(try_catch_statement, zone()); | 4812 block->statements()->Add(try_catch_statement, zone()); |
4822 return block; | 4813 return block; |
4823 } | 4814 } |
4824 | 4815 |
4825 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { | 4816 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { |
4826 DCHECK_NOT_NULL(function_state_->generator_object_variable()); | 4817 DCHECK_NOT_NULL(function_state_->generator_object_variable()); |
4827 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 4818 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
4828 args->Add(factory()->NewThisFunction(pos), zone()); | 4819 args->Add(factory()->NewThisFunction(pos), zone()); |
4829 args->Add(IsArrowFunction(kind) | 4820 args->Add(IsArrowFunction(kind) |
4830 ? GetLiteralUndefined(pos) | 4821 ? GetLiteralUndefined(pos) |
4831 : ThisExpression(scope(), factory(), kNoSourcePosition), | 4822 : ThisExpression(factory(), kNoSourcePosition), |
4832 zone()); | 4823 zone()); |
4833 return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, | 4824 return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, |
4834 pos); | 4825 pos); |
4835 } | 4826 } |
4836 | 4827 |
4837 Expression* Parser::BuildPromiseResolve(Expression* value, int pos) { | 4828 Expression* Parser::BuildPromiseResolve(Expression* value, int pos) { |
4838 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); | 4829 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); |
4839 args->Add(value, zone()); | 4830 args->Add(value, zone()); |
4840 return factory()->NewCallRuntime(Context::PROMISE_CREATE_RESOLVED_INDEX, args, | 4831 return factory()->NewCallRuntime(Context::PROMISE_CREATE_RESOLVED_INDEX, args, |
4841 pos); | 4832 pos); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4942 } else if (IsAsyncFunction(kind)) { | 4933 } else if (IsAsyncFunction(kind)) { |
4943 const bool accept_IN = true; | 4934 const bool accept_IN = true; |
4944 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, | 4935 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, |
4945 FunctionBody::Normal, accept_IN, pos, CHECK_OK); | 4936 FunctionBody::Normal, accept_IN, pos, CHECK_OK); |
4946 } else { | 4937 } else { |
4947 ParseStatementList(body, Token::RBRACE, CHECK_OK); | 4938 ParseStatementList(body, Token::RBRACE, CHECK_OK); |
4948 } | 4939 } |
4949 | 4940 |
4950 if (IsSubclassConstructor(kind)) { | 4941 if (IsSubclassConstructor(kind)) { |
4951 body->Add(factory()->NewReturnStatement( | 4942 body->Add(factory()->NewReturnStatement( |
4952 this->ThisExpression(scope(), factory(), kNoSourcePosition), | 4943 this->ThisExpression(factory(), kNoSourcePosition), |
4953 kNoSourcePosition), | 4944 kNoSourcePosition), |
4954 zone()); | 4945 zone()); |
4955 } | 4946 } |
4956 } | 4947 } |
4957 | 4948 |
4958 Expect(Token::RBRACE, CHECK_OK); | 4949 Expect(Token::RBRACE, CHECK_OK); |
4959 scope()->set_end_position(scanner()->location().end_pos); | 4950 scope()->set_end_position(scanner()->location().end_pos); |
4960 | 4951 |
4961 if (!parameters.is_simple) { | 4952 if (!parameters.is_simple) { |
4962 DCHECK_NOT_NULL(inner_scope); | 4953 DCHECK_NOT_NULL(inner_scope); |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5760 Expression* super_constructor = factory()->NewCallRuntime( | 5751 Expression* super_constructor = factory()->NewCallRuntime( |
5761 Runtime::kInlineGetSuperConstructor, tmp, pos); | 5752 Runtime::kInlineGetSuperConstructor, tmp, pos); |
5762 args->InsertAt(0, super_constructor, zone()); | 5753 args->InsertAt(0, super_constructor, zone()); |
5763 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); | 5754 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); |
5764 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, | 5755 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, |
5765 pos); | 5756 pos); |
5766 } else { | 5757 } else { |
5767 if (function->IsProperty()) { | 5758 if (function->IsProperty()) { |
5768 // Method calls | 5759 // Method calls |
5769 if (function->AsProperty()->IsSuperAccess()) { | 5760 if (function->AsProperty()->IsSuperAccess()) { |
5770 Expression* home = | 5761 Expression* home = ThisExpression(factory(), kNoSourcePosition); |
5771 ThisExpression(scope(), factory(), kNoSourcePosition); | |
5772 args->InsertAt(0, function, zone()); | 5762 args->InsertAt(0, function, zone()); |
5773 args->InsertAt(1, home, zone()); | 5763 args->InsertAt(1, home, zone()); |
5774 } else { | 5764 } else { |
5775 Variable* temp = | 5765 Variable* temp = |
5776 scope()->NewTemporary(ast_value_factory()->empty_string()); | 5766 scope()->NewTemporary(ast_value_factory()->empty_string()); |
5777 VariableProxy* obj = factory()->NewVariableProxy(temp); | 5767 VariableProxy* obj = factory()->NewVariableProxy(temp); |
5778 Assignment* assign_obj = factory()->NewAssignment( | 5768 Assignment* assign_obj = factory()->NewAssignment( |
5779 Token::ASSIGN, obj, function->AsProperty()->obj(), | 5769 Token::ASSIGN, obj, function->AsProperty()->obj(), |
5780 kNoSourcePosition); | 5770 kNoSourcePosition); |
5781 function = factory()->NewProperty( | 5771 function = factory()->NewProperty( |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6006 } | 5996 } |
6007 | 5997 |
6008 Expression* Parser::RewriteAssignExponentiation(Expression* left, | 5998 Expression* Parser::RewriteAssignExponentiation(Expression* left, |
6009 Expression* right, int pos) { | 5999 Expression* right, int pos) { |
6010 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 6000 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
6011 if (left->IsVariableProxy()) { | 6001 if (left->IsVariableProxy()) { |
6012 VariableProxy* lhs = left->AsVariableProxy(); | 6002 VariableProxy* lhs = left->AsVariableProxy(); |
6013 | 6003 |
6014 Expression* result; | 6004 Expression* result; |
6015 DCHECK_NOT_NULL(lhs->raw_name()); | 6005 DCHECK_NOT_NULL(lhs->raw_name()); |
6016 result = | 6006 result = this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), |
6017 this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), | 6007 lhs->end_position(), factory()); |
6018 lhs->end_position(), scope(), factory()); | |
6019 args->Add(left, zone()); | 6008 args->Add(left, zone()); |
6020 args->Add(right, zone()); | 6009 args->Add(right, zone()); |
6021 Expression* call = | 6010 Expression* call = |
6022 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); | 6011 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); |
6023 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); | 6012 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); |
6024 } else if (left->IsProperty()) { | 6013 } else if (left->IsProperty()) { |
6025 Property* prop = left->AsProperty(); | 6014 Property* prop = left->AsProperty(); |
6026 auto temp_obj = scope()->NewTemporary(ast_value_factory()->empty_string()); | 6015 auto temp_obj = scope()->NewTemporary(ast_value_factory()->empty_string()); |
6027 auto temp_key = scope()->NewTemporary(ast_value_factory()->empty_string()); | 6016 auto temp_key = scope()->NewTemporary(ast_value_factory()->empty_string()); |
6028 Expression* assign_obj = factory()->NewAssignment( | 6017 Expression* assign_obj = factory()->NewAssignment( |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6539 factory->NewSmiLiteral(JSGeneratorObject::kThrow, nopos); | 6528 factory->NewSmiLiteral(JSGeneratorObject::kThrow, nopos); |
6540 Expression* assignment = | 6529 Expression* assignment = |
6541 factory->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos); | 6530 factory->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos); |
6542 set_mode_throw = factory->NewExpressionStatement(assignment, nopos); | 6531 set_mode_throw = factory->NewExpressionStatement(assignment, nopos); |
6543 } | 6532 } |
6544 | 6533 |
6545 | 6534 |
6546 // input = function.sent; | 6535 // input = function.sent; |
6547 Statement* get_input; | 6536 Statement* get_input; |
6548 { | 6537 { |
6549 Expression* function_sent = FunctionSentExpression(scope, factory, nopos); | 6538 Expression* function_sent = FunctionSentExpression(factory, nopos); |
6550 Expression* input_proxy = factory->NewVariableProxy(var_input); | 6539 Expression* input_proxy = factory->NewVariableProxy(var_input); |
6551 Expression* assignment = factory->NewAssignment( | 6540 Expression* assignment = factory->NewAssignment( |
6552 Token::ASSIGN, input_proxy, function_sent, nopos); | 6541 Token::ASSIGN, input_proxy, function_sent, nopos); |
6553 get_input = factory->NewExpressionStatement(assignment, nopos); | 6542 get_input = factory->NewExpressionStatement(assignment, nopos); |
6554 } | 6543 } |
6555 | 6544 |
6556 | 6545 |
6557 // if (mode === kReturn) { | 6546 // if (mode === kReturn) { |
6558 // return {value: output.value, done: true}; | 6547 // return {value: output.value, done: true}; |
6559 // } | 6548 // } |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7165 node->Print(Isolate::Current()); | 7154 node->Print(Isolate::Current()); |
7166 } | 7155 } |
7167 #endif // DEBUG | 7156 #endif // DEBUG |
7168 | 7157 |
7169 #undef CHECK_OK | 7158 #undef CHECK_OK |
7170 #undef CHECK_OK_VOID | 7159 #undef CHECK_OK_VOID |
7171 #undef CHECK_FAILED | 7160 #undef CHECK_FAILED |
7172 | 7161 |
7173 } // namespace internal | 7162 } // namespace internal |
7174 } // namespace v8 | 7163 } // namespace v8 |
OLD | NEW |