Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: src/full-codegen/full-codegen.cc

Issue 1553703002: [runtime] TailCallRuntime and CallRuntime should use default argument counts (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@2015-12-29_TailCallRuntime_default_result_size_1_1550923002
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/full-codegen/full-codegen.h" 5 #include "src/full-codegen/full-codegen.h"
6 6
7 #include "src/ast/ast.h" 7 #include "src/ast/ast.h"
8 #include "src/ast/ast-numbering.h" 8 #include "src/ast/ast-numbering.h"
9 #include "src/ast/prettyprinter.h" 9 #include "src/ast/prettyprinter.h"
10 #include "src/ast/scopeinfo.h" 10 #include "src/ast/scopeinfo.h"
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 RecordPosition(masm_, expr->position()); 607 RecordPosition(masm_, expr->position());
608 if (info_->is_debug()) { 608 if (info_->is_debug()) {
609 // Always emit a debug break slot before a call. 609 // Always emit a debug break slot before a call.
610 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_CALL); 610 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_CALL);
611 } 611 }
612 } 612 }
613 613
614 614
615 void FullCodeGenerator::VisitSuperPropertyReference( 615 void FullCodeGenerator::VisitSuperPropertyReference(
616 SuperPropertyReference* super) { 616 SuperPropertyReference* super) {
617 __ CallRuntime(Runtime::kThrowUnsupportedSuperError, 0); 617 __ CallRuntime(Runtime::kThrowUnsupportedSuperError);
618 } 618 }
619 619
620 620
621 void FullCodeGenerator::VisitSuperCallReference(SuperCallReference* super) { 621 void FullCodeGenerator::VisitSuperCallReference(SuperCallReference* super) {
622 __ CallRuntime(Runtime::kThrowUnsupportedSuperError, 0); 622 __ CallRuntime(Runtime::kThrowUnsupportedSuperError);
623 } 623 }
624 624
625 625
626 void FullCodeGenerator::EmitGeneratorNext(CallRuntime* expr) { 626 void FullCodeGenerator::EmitGeneratorNext(CallRuntime* expr) {
627 ZoneList<Expression*>* args = expr->arguments(); 627 ZoneList<Expression*>* args = expr->arguments();
628 DCHECK(args->length() == 2); 628 DCHECK(args->length() == 2);
629 EmitGeneratorResume(args->at(0), args->at(1), JSGeneratorObject::NEXT); 629 EmitGeneratorResume(args->at(0), args->at(1), JSGeneratorObject::NEXT);
630 } 630 }
631 631
632 632
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 while (current != NULL) { 907 while (current != NULL) {
908 current = current->Exit(&stack_depth, &context_length); 908 current = current->Exit(&stack_depth, &context_length);
909 } 909 }
910 __ Drop(stack_depth); 910 __ Drop(stack_depth);
911 } 911 }
912 912
913 913
914 void FullCodeGenerator::EmitPropertyKey(ObjectLiteralProperty* property, 914 void FullCodeGenerator::EmitPropertyKey(ObjectLiteralProperty* property,
915 BailoutId bailout_id) { 915 BailoutId bailout_id) {
916 VisitForStackValue(property->key()); 916 VisitForStackValue(property->key());
917 __ CallRuntime(Runtime::kToName, 1); 917 __ CallRuntime(Runtime::kToName);
918 PrepareForBailoutForId(bailout_id, NO_REGISTERS); 918 PrepareForBailoutForId(bailout_id, NO_REGISTERS);
919 __ Push(result_register()); 919 __ Push(result_register());
920 } 920 }
921 921
922 922
923 void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { 923 void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
924 Comment cmnt(masm_, "[ ReturnStatement"); 924 Comment cmnt(masm_, "[ ReturnStatement");
925 SetStatementPosition(stmt); 925 SetStatementPosition(stmt);
926 Expression* expr = stmt->expression(); 926 Expression* expr = stmt->expression();
927 VisitForAccumulatorValue(expr); 927 VisitForAccumulatorValue(expr);
928 EmitUnwindBeforeReturn(); 928 EmitUnwindBeforeReturn();
929 EmitReturnSequence(); 929 EmitReturnSequence();
930 } 930 }
931 931
932 932
933 void FullCodeGenerator::VisitWithStatement(WithStatement* stmt) { 933 void FullCodeGenerator::VisitWithStatement(WithStatement* stmt) {
934 Comment cmnt(masm_, "[ WithStatement"); 934 Comment cmnt(masm_, "[ WithStatement");
935 SetStatementPosition(stmt); 935 SetStatementPosition(stmt);
936 936
937 VisitForAccumulatorValue(stmt->expression()); 937 VisitForAccumulatorValue(stmt->expression());
938 Callable callable = CodeFactory::ToObject(isolate()); 938 Callable callable = CodeFactory::ToObject(isolate());
939 __ Move(callable.descriptor().GetRegisterParameter(0), result_register()); 939 __ Move(callable.descriptor().GetRegisterParameter(0), result_register());
940 __ Call(callable.code(), RelocInfo::CODE_TARGET); 940 __ Call(callable.code(), RelocInfo::CODE_TARGET);
941 PrepareForBailoutForId(stmt->ToObjectId(), NO_REGISTERS); 941 PrepareForBailoutForId(stmt->ToObjectId(), NO_REGISTERS);
942 __ Push(result_register()); 942 __ Push(result_register());
943 PushFunctionArgumentForContextAllocation(); 943 PushFunctionArgumentForContextAllocation();
944 __ CallRuntime(Runtime::kPushWithContext, 2); 944 __ CallRuntime(Runtime::kPushWithContext);
945 StoreToFrameField(StandardFrameConstants::kContextOffset, context_register()); 945 StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
946 PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS); 946 PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS);
947 947
948 Scope* saved_scope = scope(); 948 Scope* saved_scope = scope();
949 scope_ = stmt->scope(); 949 scope_ = stmt->scope();
950 { WithOrCatch body(this); 950 { WithOrCatch body(this);
951 Visit(stmt->statement()); 951 Visit(stmt->statement());
952 } 952 }
953 scope_ = saved_scope; 953 scope_ = saved_scope;
954 954
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 __ bind(&handler_entry); 1131 __ bind(&handler_entry);
1132 PrepareForBailoutForId(stmt->HandlerId(), NO_REGISTERS); 1132 PrepareForBailoutForId(stmt->HandlerId(), NO_REGISTERS);
1133 ClearPendingMessage(); 1133 ClearPendingMessage();
1134 1134
1135 // Exception handler code, the exception is in the result register. 1135 // Exception handler code, the exception is in the result register.
1136 // Extend the context before executing the catch block. 1136 // Extend the context before executing the catch block.
1137 { Comment cmnt(masm_, "[ Extend catch context"); 1137 { Comment cmnt(masm_, "[ Extend catch context");
1138 __ Push(stmt->variable()->name()); 1138 __ Push(stmt->variable()->name());
1139 __ Push(result_register()); 1139 __ Push(result_register());
1140 PushFunctionArgumentForContextAllocation(); 1140 PushFunctionArgumentForContextAllocation();
1141 __ CallRuntime(Runtime::kPushCatchContext, 3); 1141 __ CallRuntime(Runtime::kPushCatchContext);
1142 StoreToFrameField(StandardFrameConstants::kContextOffset, 1142 StoreToFrameField(StandardFrameConstants::kContextOffset,
1143 context_register()); 1143 context_register());
1144 } 1144 }
1145 1145
1146 Scope* saved_scope = scope(); 1146 Scope* saved_scope = scope();
1147 scope_ = stmt->scope(); 1147 scope_ = stmt->scope();
1148 DCHECK(scope_->declarations()->is_empty()); 1148 DCHECK(scope_->declarations()->is_empty());
1149 { WithOrCatch catch_body(this); 1149 { WithOrCatch catch_body(this);
1150 Visit(stmt->catch_block()); 1150 Visit(stmt->catch_block());
1151 } 1151 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 __ jmp(&try_entry); 1201 __ jmp(&try_entry);
1202 __ bind(&handler_entry); 1202 __ bind(&handler_entry);
1203 PrepareForBailoutForId(stmt->HandlerId(), NO_REGISTERS); 1203 PrepareForBailoutForId(stmt->HandlerId(), NO_REGISTERS);
1204 1204
1205 // Exception handler code. This code is only executed when an exception 1205 // Exception handler code. This code is only executed when an exception
1206 // is thrown. The exception is in the result register, and must be 1206 // is thrown. The exception is in the result register, and must be
1207 // preserved by the finally block. Call the finally block and then 1207 // preserved by the finally block. Call the finally block and then
1208 // rethrow the exception if it returns. 1208 // rethrow the exception if it returns.
1209 __ Call(&finally_entry); 1209 __ Call(&finally_entry);
1210 __ Push(result_register()); 1210 __ Push(result_register());
1211 __ CallRuntime(Runtime::kReThrow, 1); 1211 __ CallRuntime(Runtime::kReThrow);
1212 1212
1213 // Finally block implementation. 1213 // Finally block implementation.
1214 __ bind(&finally_entry); 1214 __ bind(&finally_entry);
1215 EnterFinallyBlock(); 1215 EnterFinallyBlock();
1216 { Finally finally_body(this); 1216 { Finally finally_body(this);
1217 Visit(stmt->finally_block()); 1217 Visit(stmt->finally_block());
1218 } 1218 }
1219 ExitFinallyBlock(); // Return to the calling code. 1219 ExitFinallyBlock(); // Return to the calling code.
1220 1220
1221 // Set up try handler. 1221 // Set up try handler.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 VisitForStackValue(lit->extends()); 1318 VisitForStackValue(lit->extends());
1319 } else { 1319 } else {
1320 __ Push(isolate()->factory()->the_hole_value()); 1320 __ Push(isolate()->factory()->the_hole_value());
1321 } 1321 }
1322 1322
1323 VisitForStackValue(lit->constructor()); 1323 VisitForStackValue(lit->constructor());
1324 1324
1325 __ Push(Smi::FromInt(lit->start_position())); 1325 __ Push(Smi::FromInt(lit->start_position()));
1326 __ Push(Smi::FromInt(lit->end_position())); 1326 __ Push(Smi::FromInt(lit->end_position()));
1327 1327
1328 __ CallRuntime(Runtime::kDefineClass, 5); 1328 __ CallRuntime(Runtime::kDefineClass);
1329 PrepareForBailoutForId(lit->CreateLiteralId(), TOS_REG); 1329 PrepareForBailoutForId(lit->CreateLiteralId(), TOS_REG);
1330 1330
1331 EmitClassDefineProperties(lit); 1331 EmitClassDefineProperties(lit);
1332 1332
1333 if (lit->class_variable_proxy() != nullptr) { 1333 if (lit->class_variable_proxy() != nullptr) {
1334 EmitVariableAssignment(lit->class_variable_proxy()->var(), Token::INIT, 1334 EmitVariableAssignment(lit->class_variable_proxy()->var(), Token::INIT,
1335 lit->ProxySlot()); 1335 lit->ProxySlot());
1336 } 1336 }
1337 } 1337 }
1338 1338
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 shared->set_internal_formal_parameter_count(parameters); 1373 shared->set_internal_formal_parameter_count(parameters);
1374 1374
1375 EmitNewClosure(shared, false); 1375 EmitNewClosure(shared, false);
1376 } 1376 }
1377 1377
1378 1378
1379 void FullCodeGenerator::VisitThrow(Throw* expr) { 1379 void FullCodeGenerator::VisitThrow(Throw* expr) {
1380 Comment cmnt(masm_, "[ Throw"); 1380 Comment cmnt(masm_, "[ Throw");
1381 VisitForStackValue(expr->exception()); 1381 VisitForStackValue(expr->exception());
1382 SetExpressionPosition(expr); 1382 SetExpressionPosition(expr);
1383 __ CallRuntime(Runtime::kThrow, 1); 1383 __ CallRuntime(Runtime::kThrow);
1384 // Never returns here. 1384 // Never returns here.
1385 } 1385 }
1386 1386
1387 1387
1388 void FullCodeGenerator::EnterTryBlock(int handler_index, Label* handler) { 1388 void FullCodeGenerator::EnterTryBlock(int handler_index, Label* handler) {
1389 HandlerTableEntry* entry = &handler_table_[handler_index]; 1389 HandlerTableEntry* entry = &handler_table_[handler_index];
1390 entry->range_start = masm()->pc_offset(); 1390 entry->range_start = masm()->pc_offset();
1391 entry->handler_offset = handler->pos(); 1391 entry->handler_offset = handler->pos();
1392 entry->try_catch_depth = try_catch_depth_; 1392 entry->try_catch_depth = try_catch_depth_;
1393 1393
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1635 codegen_->PrepareForBailoutForId(entry_id, NO_REGISTERS); 1635 codegen_->PrepareForBailoutForId(entry_id, NO_REGISTERS);
1636 needs_block_context_ = false; 1636 needs_block_context_ = false;
1637 } else { 1637 } else {
1638 needs_block_context_ = scope->NeedsContext(); 1638 needs_block_context_ = scope->NeedsContext();
1639 codegen_->scope_ = scope; 1639 codegen_->scope_ = scope;
1640 { 1640 {
1641 if (needs_block_context_) { 1641 if (needs_block_context_) {
1642 Comment cmnt(masm(), "[ Extend block context"); 1642 Comment cmnt(masm(), "[ Extend block context");
1643 __ Push(scope->GetScopeInfo(codegen->isolate())); 1643 __ Push(scope->GetScopeInfo(codegen->isolate()));
1644 codegen_->PushFunctionArgumentForContextAllocation(); 1644 codegen_->PushFunctionArgumentForContextAllocation();
1645 __ CallRuntime(Runtime::kPushBlockContext, 2); 1645 __ CallRuntime(Runtime::kPushBlockContext);
1646 1646
1647 // Replace the context stored in the frame. 1647 // Replace the context stored in the frame.
1648 codegen_->StoreToFrameField(StandardFrameConstants::kContextOffset, 1648 codegen_->StoreToFrameField(StandardFrameConstants::kContextOffset,
1649 codegen_->context_register()); 1649 codegen_->context_register());
1650 } 1650 }
1651 CHECK_EQ(0, scope->num_stack_slots()); 1651 CHECK_EQ(0, scope->num_stack_slots());
1652 codegen_->PrepareForBailoutForId(entry_id, NO_REGISTERS); 1652 codegen_->PrepareForBailoutForId(entry_id, NO_REGISTERS);
1653 } 1653 }
1654 { 1654 {
1655 Comment cmnt(masm(), "[ Declarations"); 1655 Comment cmnt(masm(), "[ Declarations");
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1730 return var->mode() == CONST_LEGACY || var->scope()->is_nonlinear() || 1730 return var->mode() == CONST_LEGACY || var->scope()->is_nonlinear() ||
1731 var->initializer_position() >= proxy->position(); 1731 var->initializer_position() >= proxy->position();
1732 } 1732 }
1733 1733
1734 1734
1735 #undef __ 1735 #undef __
1736 1736
1737 1737
1738 } // namespace internal 1738 } // namespace internal
1739 } // namespace v8 1739 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698