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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 ZoneList<Statement*>* body = NULL; | 352 ZoneList<Statement*>* body = NULL; |
353 | 353 |
354 { | 354 { |
355 AstNodeFactory function_factory(ast_value_factory()); | 355 AstNodeFactory function_factory(ast_value_factory()); |
356 FunctionState function_state(&function_state_, &scope_, function_scope, | 356 FunctionState function_state(&function_state_, &scope_, function_scope, |
357 kind, &function_factory); | 357 kind, &function_factory); |
358 | 358 |
359 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone()); | 359 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone()); |
360 AddAssertIsConstruct(body, pos); | 360 AddAssertIsConstruct(body, pos); |
361 if (call_super) { | 361 if (call_super) { |
362 // %_DefaultConstructorCallSuper(new.target, .this_function) | |
363 ZoneList<Expression*>* args = | 362 ZoneList<Expression*>* args = |
364 new (zone()) ZoneList<Expression*>(2, zone()); | 363 new (zone()) ZoneList<Expression*>(0, zone()); |
365 VariableProxy* new_target_proxy = scope_->NewUnresolved( | |
366 factory(), ast_value_factory()->new_target_string(), Variable::NORMAL, | |
367 pos); | |
368 args->Add(new_target_proxy, zone()); | |
369 VariableProxy* this_function_proxy = scope_->NewUnresolved( | |
370 factory(), ast_value_factory()->this_function_string(), | |
371 Variable::NORMAL, pos); | |
372 args->Add(this_function_proxy, zone()); | |
373 CallRuntime* call = factory()->NewCallRuntime( | 364 CallRuntime* call = factory()->NewCallRuntime( |
374 ast_value_factory()->empty_string(), | 365 ast_value_factory()->empty_string(), |
375 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper), | 366 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper), |
376 args, pos); | 367 args, pos); |
377 body->Add(factory()->NewReturnStatement(call, pos), zone()); | 368 body->Add(factory()->NewReturnStatement(call, pos), zone()); |
378 } | 369 } |
379 | 370 |
380 materialized_literal_count = function_state.materialized_literal_count(); | 371 materialized_literal_count = function_state.materialized_literal_count(); |
381 expected_property_count = function_state.expected_property_count(); | 372 expected_property_count = function_state.expected_property_count(); |
382 handler_count = function_state.handler_count(); | 373 handler_count = function_state.handler_count(); |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 } | 740 } |
750 | 741 |
751 | 742 |
752 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, | 743 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, |
753 int pos) { | 744 int pos) { |
754 return scope->NewUnresolved(factory, | 745 return scope->NewUnresolved(factory, |
755 parser_->ast_value_factory()->this_string(), | 746 parser_->ast_value_factory()->this_string(), |
756 Variable::THIS, pos, pos + 4); | 747 Variable::THIS, pos, pos + 4); |
757 } | 748 } |
758 | 749 |
759 Expression* ParserTraits::SuperPropertyReference(Scope* scope, | 750 Expression* ParserTraits::SuperReference(Scope* scope, AstNodeFactory* factory, |
760 AstNodeFactory* factory, | 751 int pos) { |
761 int pos) { | 752 // TODO(arv): Split into SuperProperty and SuperCall? |
762 VariableProxy* home_object_proxy = scope->NewUnresolved( | 753 VariableProxy* home_object_proxy = scope->NewUnresolved( |
763 factory, parser_->ast_value_factory()->home_object_string(), | 754 factory, parser_->ast_value_factory()->home_object_string(), |
764 Variable::NORMAL, pos); | 755 Variable::NORMAL, pos); |
765 return factory->NewSuperPropertyReference( | 756 |
| 757 return factory->NewSuperReference( |
766 ThisExpression(scope, factory, pos)->AsVariableProxy(), home_object_proxy, | 758 ThisExpression(scope, factory, pos)->AsVariableProxy(), home_object_proxy, |
767 pos); | 759 pos); |
768 } | 760 } |
769 | 761 |
770 | 762 |
771 Expression* ParserTraits::SuperCallReference(Scope* scope, | |
772 AstNodeFactory* factory, int pos) { | |
773 VariableProxy* new_target_proxy = scope->NewUnresolved( | |
774 factory, parser_->ast_value_factory()->new_target_string(), | |
775 Variable::NORMAL, pos); | |
776 VariableProxy* this_function_proxy = scope->NewUnresolved( | |
777 factory, parser_->ast_value_factory()->this_function_string(), | |
778 Variable::NORMAL, pos); | |
779 return factory->NewSuperCallReference( | |
780 ThisExpression(scope, factory, pos)->AsVariableProxy(), new_target_proxy, | |
781 this_function_proxy, pos); | |
782 } | |
783 | |
784 | |
785 Expression* ParserTraits::DefaultConstructor(bool call_super, Scope* scope, | 763 Expression* ParserTraits::DefaultConstructor(bool call_super, Scope* scope, |
786 int pos, int end_pos) { | 764 int pos, int end_pos) { |
787 return parser_->DefaultConstructor(call_super, scope, pos, end_pos); | 765 return parser_->DefaultConstructor(call_super, scope, pos, end_pos); |
788 } | 766 } |
789 | 767 |
790 | 768 |
791 Literal* ParserTraits::ExpressionFromLiteral(Token::Value token, int pos, | 769 Literal* ParserTraits::ExpressionFromLiteral(Token::Value token, int pos, |
792 Scanner* scanner, | 770 Scanner* scanner, |
793 AstNodeFactory* factory) { | 771 AstNodeFactory* factory) { |
794 switch (token) { | 772 switch (token) { |
(...skipping 4964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5759 zone()); | 5737 zone()); |
5760 return list; | 5738 return list; |
5761 } | 5739 } |
5762 UNREACHABLE(); | 5740 UNREACHABLE(); |
5763 } | 5741 } |
5764 | 5742 |
5765 | 5743 |
5766 Expression* Parser::SpreadCall(Expression* function, | 5744 Expression* Parser::SpreadCall(Expression* function, |
5767 ZoneList<v8::internal::Expression*>* args, | 5745 ZoneList<v8::internal::Expression*>* args, |
5768 int pos) { | 5746 int pos) { |
5769 if (function->IsSuperCallReference()) { | 5747 if (function->IsSuperReference()) { |
5770 // Super calls | 5748 // Super calls |
5771 // %_CallSuperWithSpread(%ReflectConstruct(<super>, args, new.target)) | |
5772 args->InsertAt(0, function, zone()); | 5749 args->InsertAt(0, function, zone()); |
5773 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); | 5750 args->Add(factory()->NewVariableProxy(scope_->new_target_var()), zone()); |
5774 Expression* result = factory()->NewCallRuntime( | 5751 Expression* result = factory()->NewCallRuntime( |
5775 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5752 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
5776 args = new (zone()) ZoneList<Expression*>(1, zone()); | 5753 args = new (zone()) ZoneList<Expression*>(0, zone()); |
5777 args->Add(result, zone()); | 5754 args->Add(result, zone()); |
5778 return factory()->NewCallRuntime( | 5755 return factory()->NewCallRuntime( |
5779 ast_value_factory()->empty_string(), | 5756 ast_value_factory()->empty_string(), |
5780 Runtime::FunctionForId(Runtime::kInlineCallSuperWithSpread), args, pos); | 5757 Runtime::FunctionForId(Runtime::kInlineCallSuperWithSpread), args, pos); |
5781 } else { | 5758 } else { |
5782 if (function->IsProperty()) { | 5759 if (function->IsProperty()) { |
5783 // Method calls | 5760 // Method calls |
5784 if (function->AsProperty()->IsSuperAccess()) { | 5761 if (function->AsProperty()->IsSuperAccess()) { |
5785 Expression* home = | 5762 Expression* home = |
5786 ThisExpression(scope_, factory(), RelocInfo::kNoPosition); | 5763 ThisExpression(scope_, factory(), RelocInfo::kNoPosition); |
(...skipping 26 matching lines...) Expand all Loading... |
5813 | 5790 |
5814 Expression* Parser::SpreadCallNew(Expression* function, | 5791 Expression* Parser::SpreadCallNew(Expression* function, |
5815 ZoneList<v8::internal::Expression*>* args, | 5792 ZoneList<v8::internal::Expression*>* args, |
5816 int pos) { | 5793 int pos) { |
5817 args->InsertAt(0, function, zone()); | 5794 args->InsertAt(0, function, zone()); |
5818 | 5795 |
5819 return factory()->NewCallRuntime( | 5796 return factory()->NewCallRuntime( |
5820 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5797 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
5821 } | 5798 } |
5822 } } // namespace v8::internal | 5799 } } // namespace v8::internal |
OLD | NEW |