Chromium Code Reviews| 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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 auto constructor_args_name = ast_value_factory()->empty_string(); | 268 auto constructor_args_name = ast_value_factory()->empty_string(); |
| 269 bool is_duplicate; | 269 bool is_duplicate; |
| 270 bool is_rest = true; | 270 bool is_rest = true; |
| 271 bool is_optional = false; | 271 bool is_optional = false; |
| 272 Variable* constructor_args = function_scope->DeclareParameter( | 272 Variable* constructor_args = function_scope->DeclareParameter( |
| 273 constructor_args_name, TEMPORARY, is_optional, is_rest, &is_duplicate, | 273 constructor_args_name, TEMPORARY, is_optional, is_rest, &is_duplicate, |
| 274 ast_value_factory()); | 274 ast_value_factory()); |
| 275 | 275 |
| 276 ZoneList<Expression*>* args = | 276 ZoneList<Expression*>* args = |
| 277 new (zone()) ZoneList<Expression*>(2, zone()); | 277 new (zone()) ZoneList<Expression*>(2, zone()); |
| 278 VariableProxy* this_function_proxy = this->scope()->NewUnresolved( | 278 VariableProxy* this_function_proxy = NewUnresolved( |
| 279 factory(), ast_value_factory()->this_function_string(), | 279 ast_value_factory()->this_function_string(), Variable::NORMAL, pos); |
|
adamk
2016/08/09 20:11:45
I don't think we want callers like this to have to
| |
| 280 Variable::NORMAL, pos); | |
| 281 ZoneList<Expression*>* tmp = | 280 ZoneList<Expression*>* tmp = |
| 282 new (zone()) ZoneList<Expression*>(1, zone()); | 281 new (zone()) ZoneList<Expression*>(1, zone()); |
| 283 tmp->Add(this_function_proxy, zone()); | 282 tmp->Add(this_function_proxy, zone()); |
| 284 Expression* super_constructor = factory()->NewCallRuntime( | 283 Expression* super_constructor = factory()->NewCallRuntime( |
| 285 Runtime::kInlineGetSuperConstructor, tmp, pos); | 284 Runtime::kInlineGetSuperConstructor, tmp, pos); |
| 286 args->Add(super_constructor, zone()); | 285 args->Add(super_constructor, zone()); |
| 287 Spread* spread_args = factory()->NewSpread( | 286 Spread* spread_args = factory()->NewSpread( |
| 288 factory()->NewVariableProxy(constructor_args), pos, pos); | 287 factory()->NewVariableProxy(constructor_args), pos, pos); |
| 289 ZoneList<Expression*>* spread_args_expr = | 288 ZoneList<Expression*>* spread_args_expr = |
| 290 new (zone()) ZoneList<Expression*>(1, zone()); | 289 new (zone()) ZoneList<Expression*>(1, zone()); |
| 291 spread_args_expr->Add(spread_args, zone()); | 290 spread_args_expr->Add(spread_args, zone()); |
| 292 args->AddAll(*PrepareSpreadArguments(spread_args_expr), zone()); | 291 args->AddAll(*PrepareSpreadArguments(spread_args_expr), zone()); |
| 293 VariableProxy* new_target_proxy = this->scope()->NewUnresolved( | 292 VariableProxy* new_target_proxy = NewUnresolved( |
| 294 factory(), ast_value_factory()->new_target_string(), Variable::NORMAL, | 293 ast_value_factory()->new_target_string(), Variable::NORMAL, pos); |
| 295 pos); | |
| 296 args->Add(new_target_proxy, zone()); | 294 args->Add(new_target_proxy, zone()); |
| 297 CallRuntime* call = factory()->NewCallRuntime( | 295 CallRuntime* call = factory()->NewCallRuntime( |
| 298 Context::REFLECT_CONSTRUCT_INDEX, args, pos); | 296 Context::REFLECT_CONSTRUCT_INDEX, args, pos); |
| 299 body->Add(factory()->NewReturnStatement(call, pos), zone()); | 297 body->Add(factory()->NewReturnStatement(call, pos), zone()); |
| 300 } | 298 } |
| 301 | 299 |
| 302 materialized_literal_count = function_state.materialized_literal_count(); | 300 materialized_literal_count = function_state.materialized_literal_count(); |
| 303 expected_property_count = function_state.expected_property_count(); | 301 expected_property_count = function_state.expected_property_count(); |
| 304 } | 302 } |
| 305 | 303 |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 683 char array[100]; | 681 char array[100]; |
| 684 const char* string = DoubleToCString(double_value, ArrayVector(array)); | 682 const char* string = DoubleToCString(double_value, ArrayVector(array)); |
| 685 return parser_->ast_value_factory()->GetOneByteString(string); | 683 return parser_->ast_value_factory()->GetOneByteString(string); |
| 686 } | 684 } |
| 687 | 685 |
| 688 | 686 |
| 689 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 687 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { |
| 690 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); | 688 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); |
| 691 } | 689 } |
| 692 | 690 |
| 693 Expression* ParserTraits::ThisExpression(AstNodeFactory* factory, int pos) { | 691 Expression* ParserTraits::ThisExpression(int pos) { |
| 694 return parser_->scope()->NewUnresolved( | 692 return parser_->NewUnresolved(parser_->ast_value_factory()->this_string(), |
|
adamk
2016/08/09 20:11:45
I think this is the only caller that should have t
| |
| 695 factory, parser_->ast_value_factory()->this_string(), Variable::THIS, pos, | 693 Variable::THIS, pos, pos + 4); |
| 696 pos + 4); | |
| 697 } | 694 } |
| 698 | 695 |
| 699 Expression* ParserTraits::NewSuperPropertyReference(AstNodeFactory* factory, | 696 Expression* ParserTraits::NewSuperPropertyReference(AstNodeFactory* factory, |
| 700 int pos) { | 697 int pos) { |
| 701 // this_function[home_object_symbol] | 698 // this_function[home_object_symbol] |
| 702 VariableProxy* this_function_proxy = parser_->scope()->NewUnresolved( | 699 VariableProxy* this_function_proxy = parser_->NewUnresolved( |
| 703 factory, parser_->ast_value_factory()->this_function_string(), | 700 parser_->ast_value_factory()->this_function_string(), Variable::NORMAL, |
| 704 Variable::NORMAL, pos); | 701 pos); |
| 705 Expression* home_object_symbol_literal = | 702 Expression* home_object_symbol_literal = |
| 706 factory->NewSymbolLiteral("home_object_symbol", kNoSourcePosition); | 703 factory->NewSymbolLiteral("home_object_symbol", kNoSourcePosition); |
| 707 Expression* home_object = factory->NewProperty( | 704 Expression* home_object = factory->NewProperty( |
| 708 this_function_proxy, home_object_symbol_literal, pos); | 705 this_function_proxy, home_object_symbol_literal, pos); |
| 709 return factory->NewSuperPropertyReference( | 706 return factory->NewSuperPropertyReference( |
| 710 ThisExpression(factory, pos)->AsVariableProxy(), home_object, pos); | 707 ThisExpression(pos)->AsVariableProxy(), home_object, pos); |
| 711 } | 708 } |
| 712 | 709 |
| 713 Expression* ParserTraits::NewSuperCallReference(AstNodeFactory* factory, | 710 Expression* ParserTraits::NewSuperCallReference(AstNodeFactory* factory, |
| 714 int pos) { | 711 int pos) { |
| 715 VariableProxy* new_target_proxy = parser_->scope()->NewUnresolved( | 712 VariableProxy* new_target_proxy = parser_->NewUnresolved( |
| 716 factory, parser_->ast_value_factory()->new_target_string(), | 713 parser_->ast_value_factory()->new_target_string(), Variable::NORMAL, pos); |
| 717 Variable::NORMAL, pos); | 714 VariableProxy* this_function_proxy = parser_->NewUnresolved( |
| 718 VariableProxy* this_function_proxy = parser_->scope()->NewUnresolved( | 715 parser_->ast_value_factory()->this_function_string(), Variable::NORMAL, |
| 719 factory, parser_->ast_value_factory()->this_function_string(), | 716 pos); |
| 720 Variable::NORMAL, pos); | 717 return factory->NewSuperCallReference(ThisExpression(pos)->AsVariableProxy(), |
| 721 return factory->NewSuperCallReference( | 718 new_target_proxy, this_function_proxy, |
| 722 ThisExpression(factory, pos)->AsVariableProxy(), new_target_proxy, | 719 pos); |
| 723 this_function_proxy, pos); | |
| 724 } | 720 } |
| 725 | 721 |
| 726 Expression* ParserTraits::NewTargetExpression(AstNodeFactory* factory, | 722 Expression* ParserTraits::NewTargetExpression(int pos) { |
| 727 int pos) { | |
| 728 static const int kNewTargetStringLength = 10; | 723 static const int kNewTargetStringLength = 10; |
| 729 auto proxy = parser_->scope()->NewUnresolved( | 724 auto proxy = parser_->NewUnresolved( |
| 730 factory, parser_->ast_value_factory()->new_target_string(), | 725 parser_->ast_value_factory()->new_target_string(), Variable::NORMAL, pos, |
| 731 Variable::NORMAL, pos, pos + kNewTargetStringLength); | 726 pos + kNewTargetStringLength); |
| 732 proxy->set_is_new_target(); | 727 proxy->set_is_new_target(); |
| 733 return proxy; | 728 return proxy; |
| 734 } | 729 } |
| 735 | 730 |
| 736 Expression* ParserTraits::FunctionSentExpression(AstNodeFactory* factory, | 731 Expression* ParserTraits::FunctionSentExpression(AstNodeFactory* factory, |
| 737 int pos) { | 732 int pos) { |
| 738 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). | 733 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). |
| 739 Zone* zone = parser_->zone(); | 734 Zone* zone = parser_->zone(); |
| 740 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(1, zone); | 735 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(1, zone); |
| 741 VariableProxy* generator = factory->NewVariableProxy( | 736 VariableProxy* generator = factory->NewVariableProxy( |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 764 bool has_dot = scanner->ContainsDot(); | 759 bool has_dot = scanner->ContainsDot(); |
| 765 double value = scanner->DoubleValue(); | 760 double value = scanner->DoubleValue(); |
| 766 return factory->NewNumberLiteral(value, pos, has_dot); | 761 return factory->NewNumberLiteral(value, pos, has_dot); |
| 767 } | 762 } |
| 768 default: | 763 default: |
| 769 DCHECK(false); | 764 DCHECK(false); |
| 770 } | 765 } |
| 771 return NULL; | 766 return NULL; |
| 772 } | 767 } |
| 773 | 768 |
| 774 | |
| 775 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, | 769 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, |
| 776 int start_position, | 770 int start_position, |
| 777 int end_position, | 771 int end_position) { |
| 778 AstNodeFactory* factory) { | |
| 779 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); | 772 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); |
| 780 return parser_->scope()->NewUnresolved(factory, name, Variable::NORMAL, | 773 return parser_->NewUnresolved(name, Variable::NORMAL, start_position, |
| 781 start_position, end_position); | 774 end_position); |
| 782 } | 775 } |
| 783 | 776 |
| 784 | 777 |
| 785 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, | 778 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, |
| 786 AstNodeFactory* factory) { | 779 AstNodeFactory* factory) { |
| 787 const AstRawString* symbol = GetSymbol(scanner); | 780 const AstRawString* symbol = GetSymbol(scanner); |
| 788 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); | 781 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); |
| 789 return factory->NewStringLiteral(symbol, pos); | 782 return factory->NewStringLiteral(symbol, pos); |
| 790 } | 783 } |
| 791 | 784 |
| (...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1940 | 1933 |
| 1941 case Token::TRY: | 1934 case Token::TRY: |
| 1942 return ParseTryStatement(ok); | 1935 return ParseTryStatement(ok); |
| 1943 | 1936 |
| 1944 default: | 1937 default: |
| 1945 UNREACHABLE(); | 1938 UNREACHABLE(); |
| 1946 return NULL; | 1939 return NULL; |
| 1947 } | 1940 } |
| 1948 } | 1941 } |
| 1949 | 1942 |
| 1950 | |
| 1951 VariableProxy* Parser::NewUnresolved(const AstRawString* name, | 1943 VariableProxy* Parser::NewUnresolved(const AstRawString* name, |
| 1952 VariableMode mode) { | 1944 Variable::Kind kind, int begin_pos, |
| 1945 int end_pos, VariableMode mode) { | |
| 1953 // If we are inside a function, a declaration of a 'var' variable is a | 1946 // If we are inside a function, a declaration of a 'var' variable is a |
| 1954 // truly local variable, and the scope of the variable is always the function | 1947 // truly local variable, and the scope of the variable is always the function |
| 1955 // scope. | 1948 // scope. |
| 1956 // Let/const variables are always added to the immediately enclosing scope. | 1949 // Let/const variables are always added to the immediately enclosing scope. |
| 1957 Scope* scope = | 1950 Scope* scope = |
| 1958 IsLexicalVariableMode(mode) ? this->scope() : GetDeclarationScope(); | 1951 IsLexicalVariableMode(mode) ? this->scope() : GetDeclarationScope(); |
| 1959 return scope->NewUnresolved(factory(), name, Variable::NORMAL, | 1952 return scope->NewUnresolved(factory(), name, kind, begin_pos, end_pos); |
| 1960 scanner()->location().beg_pos, | 1953 } |
| 1961 scanner()->location().end_pos); | 1954 |
| 1955 VariableProxy* Parser::NewUnresolved(const AstRawString* name, | |
| 1956 VariableMode mode) { | |
| 1957 return NewUnresolved(name, Variable::NORMAL, scanner()->location().beg_pos, | |
|
Toon Verwaest
2016/08/09 19:20:03
Not exactly sure about redirecting this through th
| |
| 1958 scanner()->location().end_pos, mode); | |
| 1962 } | 1959 } |
| 1963 | 1960 |
| 1964 InitializationFlag Parser::DefaultInitializationFlag(VariableMode mode) { | 1961 InitializationFlag Parser::DefaultInitializationFlag(VariableMode mode) { |
| 1965 DCHECK(IsDeclaredVariableMode(mode)); | 1962 DCHECK(IsDeclaredVariableMode(mode)); |
| 1966 return mode == VAR ? kCreatedInitialized : kNeedsInitialization; | 1963 return mode == VAR ? kCreatedInitialized : kNeedsInitialization; |
| 1967 } | 1964 } |
| 1968 | 1965 |
| 1969 Declaration* Parser::DeclareVariable(const AstRawString* name, | 1966 Declaration* Parser::DeclareVariable(const AstRawString* name, |
| 1970 VariableMode mode, int pos, bool* ok) { | 1967 VariableMode mode, int pos, bool* ok) { |
| 1971 return DeclareVariable(name, mode, DefaultInitializationFlag(mode), pos, ok); | 1968 return DeclareVariable(name, mode, DefaultInitializationFlag(mode), pos, ok); |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2709 Scanner::Location loc = scanner()->location(); | 2706 Scanner::Location loc = scanner()->location(); |
| 2710 | 2707 |
| 2711 Token::Value tok = peek(); | 2708 Token::Value tok = peek(); |
| 2712 Statement* result; | 2709 Statement* result; |
| 2713 Expression* return_value; | 2710 Expression* return_value; |
| 2714 if (scanner()->HasAnyLineTerminatorBeforeNext() || | 2711 if (scanner()->HasAnyLineTerminatorBeforeNext() || |
| 2715 tok == Token::SEMICOLON || | 2712 tok == Token::SEMICOLON || |
| 2716 tok == Token::RBRACE || | 2713 tok == Token::RBRACE || |
| 2717 tok == Token::EOS) { | 2714 tok == Token::EOS) { |
| 2718 if (IsSubclassConstructor(function_state_->kind())) { | 2715 if (IsSubclassConstructor(function_state_->kind())) { |
| 2719 return_value = ThisExpression(factory(), loc.beg_pos); | 2716 return_value = ThisExpression(loc.beg_pos); |
| 2720 } else { | 2717 } else { |
| 2721 return_value = GetLiteralUndefined(position()); | 2718 return_value = GetLiteralUndefined(position()); |
| 2722 } | 2719 } |
| 2723 } else { | 2720 } else { |
| 2724 int pos = peek_position(); | 2721 int pos = peek_position(); |
| 2725 | 2722 |
| 2726 if (IsSubclassConstructor(function_state_->kind())) { | 2723 if (IsSubclassConstructor(function_state_->kind())) { |
| 2727 // Because of the return code rewriting that happens in case of a subclass | 2724 // Because of the return code rewriting that happens in case of a subclass |
| 2728 // constructor we don't want to accept tail calls, therefore we don't set | 2725 // constructor we don't want to accept tail calls, therefore we don't set |
| 2729 // ReturnExprScope to kInsideValidReturnStatement here. | 2726 // ReturnExprScope to kInsideValidReturnStatement here. |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 2756 Expression* is_object_conditional = factory()->NewConditional( | 2753 Expression* is_object_conditional = factory()->NewConditional( |
| 2757 is_spec_object_call, factory()->NewVariableProxy(temp), | 2754 is_spec_object_call, factory()->NewVariableProxy(temp), |
| 2758 factory()->NewSmiLiteral(1, pos), pos); | 2755 factory()->NewSmiLiteral(1, pos), pos); |
| 2759 | 2756 |
| 2760 // temp === undefined | 2757 // temp === undefined |
| 2761 Expression* is_undefined = factory()->NewCompareOperation( | 2758 Expression* is_undefined = factory()->NewCompareOperation( |
| 2762 Token::EQ_STRICT, assign, | 2759 Token::EQ_STRICT, assign, |
| 2763 factory()->NewUndefinedLiteral(kNoSourcePosition), pos); | 2760 factory()->NewUndefinedLiteral(kNoSourcePosition), pos); |
| 2764 | 2761 |
| 2765 // is_undefined ? this : is_object_conditional | 2762 // is_undefined ? this : is_object_conditional |
| 2766 return_value = factory()->NewConditional(is_undefined, | 2763 return_value = factory()->NewConditional( |
| 2767 ThisExpression(factory(), pos), | 2764 is_undefined, ThisExpression(pos), is_object_conditional, pos); |
| 2768 is_object_conditional, pos); | |
| 2769 } else { | 2765 } else { |
| 2770 ReturnExprScope maybe_allow_tail_calls( | 2766 ReturnExprScope maybe_allow_tail_calls( |
| 2771 function_state_, ReturnExprContext::kInsideValidReturnStatement); | 2767 function_state_, ReturnExprContext::kInsideValidReturnStatement); |
| 2772 return_value = ParseExpression(true, CHECK_OK); | 2768 return_value = ParseExpression(true, CHECK_OK); |
| 2773 | 2769 |
| 2774 if (allow_tailcalls() && !is_sloppy(language_mode())) { | 2770 if (allow_tailcalls() && !is_sloppy(language_mode())) { |
| 2775 // ES6 14.6.1 Static Semantics: IsInTailPosition | 2771 // ES6 14.6.1 Static Semantics: IsInTailPosition |
| 2776 function_state_->AddImplicitTailCallExpression(return_value); | 2772 function_state_->AddImplicitTailCallExpression(return_value); |
| 2777 } | 2773 } |
| 2778 } | 2774 } |
| (...skipping 1972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4751 | 4747 |
| 4752 block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); | 4748 block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); |
| 4753 block->statements()->Add(try_catch_statement, zone()); | 4749 block->statements()->Add(try_catch_statement, zone()); |
| 4754 return block; | 4750 return block; |
| 4755 } | 4751 } |
| 4756 | 4752 |
| 4757 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { | 4753 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { |
| 4758 DCHECK_NOT_NULL(function_state_->generator_object_variable()); | 4754 DCHECK_NOT_NULL(function_state_->generator_object_variable()); |
| 4759 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 4755 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 4760 args->Add(factory()->NewThisFunction(pos), zone()); | 4756 args->Add(factory()->NewThisFunction(pos), zone()); |
| 4761 args->Add(IsArrowFunction(kind) | 4757 args->Add(IsArrowFunction(kind) ? GetLiteralUndefined(pos) |
| 4762 ? GetLiteralUndefined(pos) | 4758 : ThisExpression(kNoSourcePosition), |
| 4763 : ThisExpression(factory(), kNoSourcePosition), | |
| 4764 zone()); | 4759 zone()); |
| 4765 return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, | 4760 return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, |
| 4766 pos); | 4761 pos); |
| 4767 } | 4762 } |
| 4768 | 4763 |
| 4769 Expression* Parser::BuildPromiseResolve(Expression* value, int pos) { | 4764 Expression* Parser::BuildPromiseResolve(Expression* value, int pos) { |
| 4770 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); | 4765 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 4771 args->Add(value, zone()); | 4766 args->Add(value, zone()); |
| 4772 return factory()->NewCallRuntime(Context::PROMISE_CREATE_RESOLVED_INDEX, args, | 4767 return factory()->NewCallRuntime(Context::PROMISE_CREATE_RESOLVED_INDEX, args, |
| 4773 pos); | 4768 pos); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4874 } else if (IsAsyncFunction(kind)) { | 4869 } else if (IsAsyncFunction(kind)) { |
| 4875 const bool accept_IN = true; | 4870 const bool accept_IN = true; |
| 4876 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, | 4871 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, |
| 4877 FunctionBody::Normal, accept_IN, pos, CHECK_OK); | 4872 FunctionBody::Normal, accept_IN, pos, CHECK_OK); |
| 4878 } else { | 4873 } else { |
| 4879 ParseStatementList(body, Token::RBRACE, CHECK_OK); | 4874 ParseStatementList(body, Token::RBRACE, CHECK_OK); |
| 4880 } | 4875 } |
| 4881 | 4876 |
| 4882 if (IsSubclassConstructor(kind)) { | 4877 if (IsSubclassConstructor(kind)) { |
| 4883 body->Add(factory()->NewReturnStatement( | 4878 body->Add(factory()->NewReturnStatement( |
| 4884 this->ThisExpression(factory(), kNoSourcePosition), | 4879 this->ThisExpression(kNoSourcePosition), kNoSourcePosition), |
| 4885 kNoSourcePosition), | |
| 4886 zone()); | 4880 zone()); |
| 4887 } | 4881 } |
| 4888 } | 4882 } |
| 4889 | 4883 |
| 4890 Expect(Token::RBRACE, CHECK_OK); | 4884 Expect(Token::RBRACE, CHECK_OK); |
| 4891 scope()->set_end_position(scanner()->location().end_pos); | 4885 scope()->set_end_position(scanner()->location().end_pos); |
| 4892 | 4886 |
| 4893 if (!parameters.is_simple) { | 4887 if (!parameters.is_simple) { |
| 4894 DCHECK_NOT_NULL(inner_scope); | 4888 DCHECK_NOT_NULL(inner_scope); |
| 4895 DCHECK_EQ(function_scope, scope()); | 4889 DCHECK_EQ(function_scope, scope()); |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5693 Expression* super_constructor = factory()->NewCallRuntime( | 5687 Expression* super_constructor = factory()->NewCallRuntime( |
| 5694 Runtime::kInlineGetSuperConstructor, tmp, pos); | 5688 Runtime::kInlineGetSuperConstructor, tmp, pos); |
| 5695 args->InsertAt(0, super_constructor, zone()); | 5689 args->InsertAt(0, super_constructor, zone()); |
| 5696 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); | 5690 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); |
| 5697 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, | 5691 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, |
| 5698 pos); | 5692 pos); |
| 5699 } else { | 5693 } else { |
| 5700 if (function->IsProperty()) { | 5694 if (function->IsProperty()) { |
| 5701 // Method calls | 5695 // Method calls |
| 5702 if (function->AsProperty()->IsSuperAccess()) { | 5696 if (function->AsProperty()->IsSuperAccess()) { |
| 5703 Expression* home = ThisExpression(factory(), kNoSourcePosition); | 5697 Expression* home = ThisExpression(kNoSourcePosition); |
| 5704 args->InsertAt(0, function, zone()); | 5698 args->InsertAt(0, function, zone()); |
| 5705 args->InsertAt(1, home, zone()); | 5699 args->InsertAt(1, home, zone()); |
| 5706 } else { | 5700 } else { |
| 5707 Variable* temp = NewTemporary(ast_value_factory()->empty_string()); | 5701 Variable* temp = NewTemporary(ast_value_factory()->empty_string()); |
| 5708 VariableProxy* obj = factory()->NewVariableProxy(temp); | 5702 VariableProxy* obj = factory()->NewVariableProxy(temp); |
| 5709 Assignment* assign_obj = factory()->NewAssignment( | 5703 Assignment* assign_obj = factory()->NewAssignment( |
| 5710 Token::ASSIGN, obj, function->AsProperty()->obj(), | 5704 Token::ASSIGN, obj, function->AsProperty()->obj(), |
| 5711 kNoSourcePosition); | 5705 kNoSourcePosition); |
| 5712 function = factory()->NewProperty( | 5706 function = factory()->NewProperty( |
| 5713 assign_obj, function->AsProperty()->key(), kNoSourcePosition); | 5707 assign_obj, function->AsProperty()->key(), kNoSourcePosition); |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5938 | 5932 |
| 5939 Expression* Parser::RewriteAssignExponentiation(Expression* left, | 5933 Expression* Parser::RewriteAssignExponentiation(Expression* left, |
| 5940 Expression* right, int pos) { | 5934 Expression* right, int pos) { |
| 5941 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 5935 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 5942 if (left->IsVariableProxy()) { | 5936 if (left->IsVariableProxy()) { |
| 5943 VariableProxy* lhs = left->AsVariableProxy(); | 5937 VariableProxy* lhs = left->AsVariableProxy(); |
| 5944 | 5938 |
| 5945 Expression* result; | 5939 Expression* result; |
| 5946 DCHECK_NOT_NULL(lhs->raw_name()); | 5940 DCHECK_NOT_NULL(lhs->raw_name()); |
| 5947 result = this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), | 5941 result = this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), |
| 5948 lhs->end_position(), factory()); | 5942 lhs->end_position()); |
| 5949 args->Add(left, zone()); | 5943 args->Add(left, zone()); |
| 5950 args->Add(right, zone()); | 5944 args->Add(right, zone()); |
| 5951 Expression* call = | 5945 Expression* call = |
| 5952 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); | 5946 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); |
| 5953 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); | 5947 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); |
| 5954 } else if (left->IsProperty()) { | 5948 } else if (left->IsProperty()) { |
| 5955 Property* prop = left->AsProperty(); | 5949 Property* prop = left->AsProperty(); |
| 5956 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); | 5950 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); |
| 5957 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); | 5951 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); |
| 5958 Expression* assign_obj = factory()->NewAssignment( | 5952 Expression* assign_obj = factory()->NewAssignment( |
| (...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7093 node->Print(Isolate::Current()); | 7087 node->Print(Isolate::Current()); |
| 7094 } | 7088 } |
| 7095 #endif // DEBUG | 7089 #endif // DEBUG |
| 7096 | 7090 |
| 7097 #undef CHECK_OK | 7091 #undef CHECK_OK |
| 7098 #undef CHECK_OK_VOID | 7092 #undef CHECK_OK_VOID |
| 7099 #undef CHECK_FAILED | 7093 #undef CHECK_FAILED |
| 7100 | 7094 |
| 7101 } // namespace internal | 7095 } // namespace internal |
| 7102 } // namespace v8 | 7096 } // namespace v8 |
| OLD | NEW |