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

Side by Side Diff: src/hydrogen.cc

Issue 836093007: split api call stubs into accessor and function call stubs (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
« no previous file with comments | « src/code-stubs.h ('k') | src/ia32/code-stubs-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/hydrogen.h" 5 #include "src/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 8684 matching lines...) Expand 10 before | Expand all | Expand 10 after
8695 Handle<JSObject> api_holder = optimization.LookupHolderOfExpectedType( 8695 Handle<JSObject> api_holder = optimization.LookupHolderOfExpectedType(
8696 receiver_maps->first(), &holder_lookup); 8696 receiver_maps->first(), &holder_lookup);
8697 if (holder_lookup == CallOptimization::kHolderNotFound) return false; 8697 if (holder_lookup == CallOptimization::kHolderNotFound) return false;
8698 8698
8699 if (FLAG_trace_inlining) { 8699 if (FLAG_trace_inlining) {
8700 PrintF("Inlining api function "); 8700 PrintF("Inlining api function ");
8701 function->ShortPrint(); 8701 function->ShortPrint();
8702 PrintF("\n"); 8702 PrintF("\n");
8703 } 8703 }
8704 8704
8705 bool drop_extra = false; 8705 bool is_function = false;
8706 bool is_store = false; 8706 bool is_store = false;
8707 switch (call_type) { 8707 switch (call_type) {
8708 case kCallApiFunction: 8708 case kCallApiFunction:
8709 case kCallApiMethod: 8709 case kCallApiMethod:
8710 // Need to check that none of the receiver maps could have changed. 8710 // Need to check that none of the receiver maps could have changed.
8711 Add<HCheckMaps>(receiver, receiver_maps); 8711 Add<HCheckMaps>(receiver, receiver_maps);
8712 // Need to ensure the chain between receiver and api_holder is intact. 8712 // Need to ensure the chain between receiver and api_holder is intact.
8713 if (holder_lookup == CallOptimization::kHolderFound) { 8713 if (holder_lookup == CallOptimization::kHolderFound) {
8714 AddCheckPrototypeMaps(api_holder, receiver_maps->first()); 8714 AddCheckPrototypeMaps(api_holder, receiver_maps->first());
8715 } else { 8715 } else {
8716 DCHECK_EQ(holder_lookup, CallOptimization::kHolderIsReceiver); 8716 DCHECK_EQ(holder_lookup, CallOptimization::kHolderIsReceiver);
8717 } 8717 }
8718 // Includes receiver. 8718 // Includes receiver.
8719 PushArgumentsFromEnvironment(argc + 1); 8719 PushArgumentsFromEnvironment(argc + 1);
8720 // Drop function after call. 8720 is_function = true;
8721 drop_extra = true;
8722 break; 8721 break;
8723 case kCallApiGetter: 8722 case kCallApiGetter:
8724 // Receiver and prototype chain cannot have changed. 8723 // Receiver and prototype chain cannot have changed.
8725 DCHECK_EQ(0, argc); 8724 DCHECK_EQ(0, argc);
8726 DCHECK_EQ(NULL, receiver); 8725 DCHECK_EQ(NULL, receiver);
8727 // Receiver is on expression stack. 8726 // Receiver is on expression stack.
8728 receiver = Pop(); 8727 receiver = Pop();
8729 Add<HPushArguments>(receiver); 8728 Add<HPushArguments>(receiver);
8730 break; 8729 break;
8731 case kCallApiSetter: 8730 case kCallApiSetter:
(...skipping 17 matching lines...) Expand all
8749 break; 8748 break;
8750 case CallOptimization::kHolderIsReceiver: 8749 case CallOptimization::kHolderIsReceiver:
8751 holder = receiver; 8750 holder = receiver;
8752 break; 8751 break;
8753 case CallOptimization::kHolderNotFound: 8752 case CallOptimization::kHolderNotFound:
8754 UNREACHABLE(); 8753 UNREACHABLE();
8755 break; 8754 break;
8756 } 8755 }
8757 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); 8756 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info();
8758 Handle<Object> call_data_obj(api_call_info->data(), isolate()); 8757 Handle<Object> call_data_obj(api_call_info->data(), isolate());
8759 bool call_data_is_undefined = call_data_obj->IsUndefined(); 8758 bool call_data_undefined = call_data_obj->IsUndefined();
8760 HValue* call_data = Add<HConstant>(call_data_obj); 8759 HValue* call_data = Add<HConstant>(call_data_obj);
8761 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback())); 8760 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback()));
8762 ExternalReference ref = ExternalReference(&fun, 8761 ExternalReference ref = ExternalReference(&fun,
8763 ExternalReference::DIRECT_API_CALL, 8762 ExternalReference::DIRECT_API_CALL,
8764 isolate()); 8763 isolate());
8765 HValue* api_function_address = Add<HConstant>(ExternalReference(ref)); 8764 HValue* api_function_address = Add<HConstant>(ExternalReference(ref));
8766 8765
8767 HValue* op_vals[] = { 8766 HValue* op_vals[] = {context(), Add<HConstant>(function), call_data, holder,
8768 context(), 8767 api_function_address, nullptr};
8769 Add<HConstant>(function),
8770 call_data,
8771 holder,
8772 api_function_address
8773 };
8774 8768
8775 ApiFunctionDescriptor descriptor(isolate()); 8769 HInstruction* call = nullptr;
8776 CallApiFunctionStub stub(isolate(), is_store, call_data_is_undefined, argc); 8770 if (!is_function) {
8777 Handle<Code> code = stub.GetCode(); 8771 CallApiAccessorStub stub(isolate(), is_store, call_data_undefined);
8778 HConstant* code_value = Add<HConstant>(code); 8772 Handle<Code> code = stub.GetCode();
8773 HConstant* code_value = Add<HConstant>(code);
8774 ApiAccessorDescriptor descriptor(isolate());
8775 DCHECK(arraysize(op_vals) - 1 == descriptor.GetEnvironmentLength());
8776 call = New<HCallWithDescriptor>(
8777 code_value, argc + 1, descriptor,
8778 Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
8779 } else {
8780 op_vals[arraysize(op_vals) - 1] = Add<HConstant>(argc);
8781 CallApiFunctionStub stub(isolate(), call_data_undefined);
8782 Handle<Code> code = stub.GetCode();
8783 HConstant* code_value = Add<HConstant>(code);
8784 ApiFunctionDescriptor descriptor(isolate());
8785 DCHECK(arraysize(op_vals) == descriptor.GetEnvironmentLength());
8786 call = New<HCallWithDescriptor>(
8787 code_value, argc + 1, descriptor,
8788 Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
8789 Drop(1); // Drop function.
8790 }
8779 8791
8780 DCHECK((sizeof(op_vals) / kPointerSize) == descriptor.GetEnvironmentLength());
8781
8782 HInstruction* call = New<HCallWithDescriptor>(
8783 code_value, argc + 1, descriptor,
8784 Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
8785
8786 if (drop_extra) Drop(1); // Drop function.
8787 ast_context()->ReturnInstruction(call, ast_id); 8792 ast_context()->ReturnInstruction(call, ast_id);
8788 return true; 8793 return true;
8789 } 8794 }
8790 8795
8791 8796
8792 void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function, 8797 void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function,
8793 int arguments_count) { 8798 int arguments_count) {
8794 Handle<JSFunction> known_function; 8799 Handle<JSFunction> known_function;
8795 int args_count_no_receiver = arguments_count - 1; 8800 int args_count_no_receiver = arguments_count - 1;
8796 if (function->IsConstant() && 8801 if (function->IsConstant() &&
(...skipping 4655 matching lines...) Expand 10 before | Expand all | Expand 10 after
13452 if (ShouldProduceTraceOutput()) { 13457 if (ShouldProduceTraceOutput()) {
13453 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13458 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13454 } 13459 }
13455 13460
13456 #ifdef DEBUG 13461 #ifdef DEBUG
13457 graph_->Verify(false); // No full verify. 13462 graph_->Verify(false); // No full verify.
13458 #endif 13463 #endif
13459 } 13464 }
13460 13465
13461 } } // namespace v8::internal 13466 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/ia32/code-stubs-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698